WPF数据绑定有什么意义?实现INotifyPropertyChange与手动GUI更新

时间:2015-05-26 05:42:13

标签: c# wpf data-binding

我最近在WPF中创建了一个非常简单的应用程序,它只是从几个TextBox中读取数据并更新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();

        }
    }

这很简单,它就像一个魅力。但是我最近发现了数据绑定的世界,在那里你可以消除所有这些手动更新控件的样板代码,并让它们在模型发生变化时自行更新。

经过多次实验和阅读各种教程后,我发现,为了实现这一点,我的数据对象必须实现INotifyPropertyChanged接口,这意味着需要在我希望在我的UI上更新的属性上使用显式设置器,就像这样:

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接口必须在除模型类之外的类中实现,因为模型类在更新时会重新生成。这引出了我的问题:为什么我想在现实世界的应用程序中使用数据绑定,只需简单地手动更新我的UI就可以了?或者有没有其他方法可以做到这一点,我没有看到?

2 个答案:

答案 0 :(得分:1)

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

  • 您可以为几个完全不同的控件使用相同的模型,另一方面可以在几个完全不同的模型上使用一个复杂的控件(ViewModel只是胶水)。
  • 如果你在一个团队工作,你可能有一个人在GUI部分工作,另一个人在致力于数据库。
  • 数据库(模型)不再受到显示数据的方式的限制,只要ViewModel通知其更改,它将由View决定是否捕获它(使用简单的绑定)
  • 当你使用datatemplate时,一切都会更有意义,因为渲染复杂非常容易

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

答案 1 :(得分:0)

可能值得尝试一下Michael L.Perry的NuGet库UpdateControls,并遵循Joe White的出色安装说明。似乎不再需要使用INotifyPropertyChanged了!