【问题标题】:What is the point of WPF data binding? Implementing INotifyPropertyChange versus manual GUI updatingWPF 数据绑定的意义何在?实施 INotifyPropertyChange 与手动 GUI 更新
【发布时间】:2015-05-26 05:42:13
【问题描述】:

我最近在 WPF 中制作了一个非常简单的应用程序,它只是从几个 TextBox 中读取数据并更新 SQL Server 数据库中的记录。我还放置了后退和前进按钮,以允许用户滚动浏览可用记录。每次用户在应用程序上单击 Next 时,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 要简单得多时,为什么还要在现实世界的应用程序中使用数据绑定?或者有没有我看不到的替代方法?

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

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

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

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

    【讨论】:

    • 虽然我了解拥有视图模型的好处,但我发现需要实现 INotifyPropertyChange 并为模型中的每个字段定义显式 setter 和 getter 很麻烦,这样 UI 就可以“自我更新” ”。 .NET 框架是否提供了一种更简单的方法来执行此操作,还是一直坚持使用 INotifyPropertyChange?
    • 模型可能有几个不需要事件的字段。你在你想要的字段上实现INotifyPropertyChangedonly。它使分离更清晰,事件总数更小,同时为 GUI 增加了简单的模型感知
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多