我最近在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接口必须在除模型类之外的其他类中实现,因为在更新模型时会重新生成模型类。这就引出了我的问题:为什么在手动更新用户界面要简单得多的情况下,为什么我要在现实世界的应用程序中使用数据绑定?还是有我看不到的另一种方法?

最佳答案

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


您可以为几个完全不同的控件使用相同的模型,另一方面,可以对多个完全不同的模型使用一种复杂的控件(ViewModel只是胶水)。
如果您在团队中工作,则可能有一个人在GUI部件上工作,而另一个人则在数据库工作。
数据库(模型)不再以显示数据的方式被奴役,只要ViewModel通知其更改,就由View决定是否捕获它(通过简单绑定)
当您使用datatemplate时,一切都会变得更加有意义,因为渲染复杂度非常容易


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

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

10-12 03:58
查看更多