WPF数据绑定有什么意义?实施 INotifyPropertyChange 与手动 GUI 更新
What is the point of WPF data binding? Implementing INotifyPropertyChange versus manual GUI updating
我最近在 WPF 中制作了一个非常简单的应用程序,它只从几个文本框读取数据并更新 SQL 服务器数据库中的记录。我还放置了后退和前进按钮,以允许用户滚动浏览可用记录。每次用户在应用程序上单击“下一步”时,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 接口,这意味着需要对我希望在 [= 上更新的属性使用显式设置器23=],像这样:
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 的代码要多得多。此外,由于此 class 是实体模型的一部分,INotifyPropertyChanged 接口必须在模型 class 之外的 class 中实现,因为模型 classes 得到更新模型时重新生成。这让我想到了我的问题:当手动更新我的 UI 更简单时,为什么我要在现实世界的应用程序中使用数据绑定?还是有我没有看到的替代方法?
MVVM 模式将 GUI 逻辑与核心逻辑分离。
- 您可以为多个完全不同的控件使用相同的模型,而另一方面,可以为多个完全不同的模型使用一个复杂的控件(ViewModel 只是粘合剂)。
- 如果您在一个团队中工作,您可能会有一个人负责 GUI 部分,而另一个人则专门负责数据库。
- 数据库(模型)不再受制于您显示数据的方式,只要 ViewModel 通知其更改,View 将决定是否捕获它(使用简单的绑定)
- 当你使用数据模板时,一切都会变得更有意义,因为渲染复杂的东西会非常容易
这个模式很棒的原因有很多,网上有很多文章
我最近在 WPF 中制作了一个非常简单的应用程序,它只从几个文本框读取数据并更新 SQL 服务器数据库中的记录。我还放置了后退和前进按钮,以允许用户滚动浏览可用记录。每次用户在应用程序上单击“下一步”时,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 接口,这意味着需要对我希望在 [= 上更新的属性使用显式设置器23=],像这样:
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 的代码要多得多。此外,由于此 class 是实体模型的一部分,INotifyPropertyChanged 接口必须在模型 class 之外的 class 中实现,因为模型 classes 得到更新模型时重新生成。这让我想到了我的问题:当手动更新我的 UI 更简单时,为什么我要在现实世界的应用程序中使用数据绑定?还是有我没有看到的替代方法?
MVVM 模式将 GUI 逻辑与核心逻辑分离。
- 您可以为多个完全不同的控件使用相同的模型,而另一方面,可以为多个完全不同的模型使用一个复杂的控件(ViewModel 只是粘合剂)。
- 如果您在一个团队中工作,您可能会有一个人负责 GUI 部分,而另一个人则专门负责数据库。
- 数据库(模型)不再受制于您显示数据的方式,只要 ViewModel 通知其更改,View 将决定是否捕获它(使用简单的绑定)
- 当你使用数据模板时,一切都会变得更有意义,因为渲染复杂的东西会非常容易
这个模式很棒的原因有很多,网上有很多文章