c# - WPF 数据绑定(bind)有什么意义?实现 INotifyPropertyChange 与手动 GUI 更新

标签 c# wpf data-binding

我最近在 WPF 中制作了一个非常简单的应用程序,它只需从几个文本框中读取数据并更新 SQL Server 数据库中的记录。我还放置了后退和前进按钮,以允许用户滚动浏览可用记录。每次用户在应用程序上单击“下一步”时,UI 都会通过我称为 updateControls() 的方法使用新记录中的值进行更新,如下所示:

private void updateControls()
    {
        IQueryable<Comment> query = from t in container.Comment
                                    where t.Id == browseIndex
                                    select t;
        if (query.Count<Comment>() > 0)
        {
            currentComment = query.First<Comment>();
            txtID.Text = currentThought.Id.ToString();
            txtComment.Text = currentComment.thought;
            txtDate.DisplayDate = currentComment.date;
            txtDate.Text = currentComment.date.ToString();

        }
    }

这很简单,而且很有魅力。但我最近发现了数据绑定(bind)的世界,在这里您可以消除所有手动更新控件的样板代码,并让它们在模型发生变化时自行更新。

经过大量实验和阅读各种教程后,我发现,要实现此目的,我的数据对象必须实现 INotifyPropertyChanged 接口(interface),这意味着需要对我希望在 UI 上更新的属性使用显式 setter ,如下所示:

public class Comment: INotifyPropertyChanged {
   private string comment;
   public event PropertyChangedEventHandler PropertyChanged;

   public string Comment { get { return this.comment;}
   set {
      this.comment = value;
      NotifyPropertyChanged("Comment");
   }

   public void NotifyPropertyChanged(string propName)
   {
      if (this.PropertyChanged != null ) this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
   }

}

这比简单地用我想要的数据手动更新我的 UI 需要更多的代码。此外,由于此类是实体模型的一部分,因此必须在模型类之外的类中实现 INotifyPropertyChanged 接口(interface),因为更新模型时会重新生成模型类。这引出了我的问题:当手动更新 UI 更简单时,为什么我要在现实世界的应用程序中使用数据绑定(bind)?或者有没有我没有看到的替代方法?

最佳答案

MVVM 模式将 GUI 逻辑与核心逻辑分离。

  • 您可以为多个完全不同的控件使用相同的模型,另一方面,可以为多个完全不同的模型使用一个复杂的控件(ViewModel 只是粘合剂)。
  • 如果您在一个团队中工作,您可能会有一个人负责 GUI 部分,而另一个人则专门负责数据库。
  • 数据库(模型)不再受制于显示数据的方式,只要 ViewModel 通知其更改,就将由 View 决定是否捕获它(通过简单的绑定(bind))
  • 当您使用数据模板时,一切都会变得更有意义,因为它会很容易呈现复杂

这种模式很棒的原因有很多,互联网上有很多文章

关于c# - WPF 数据绑定(bind)有什么意义?实现 INotifyPropertyChange 与手动 GUI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30450309/

相关文章:

c# - 响应式扩展和 MouseEventArgs 源

c# - 以编程方式将项目添加到 ComboBox

wpf - 如果第一个属性是 "undefined",则绑定(bind)到第二个属性

Android Kotlin - imageUrl 的绑定(bind)适配器 AK(android.widget.ImageView, java.lang.String) 已经存在

c# - 如何在 inkcanvas 上同时进行缩放和旋转?

c# - .net c# 限制 observablecollection 中的条目数

c# - 在 select from with inner join in sql 查询中编写 linq similiar where in select from

c# - 实现代码问题

c# - ASP.NET 中的大 ViewState 值

c# - 如何在 c# blazor 中下载 xls 文件