绑定的五种模式
1、 OneWay:从源的改变更新目标的属性
2、 TwoWay:源与目标相互改变
3、 OneTime:只根据源来设置目标,以后都不会改变
4、 OneWayToSource:目标的改变使源发生变化
5、 Default:可以单向亦可双向,是靠被指定的源或目标是否有get或set指定,所以绑定的话是需要选择上面4个中的一个模式进行绑定,根据所需来选择,不选则默认为Default
MVVM中的数据交互
在MVVM模式中,界面的目标数据和后台代码中的数据源一般需要进行相互绑定,即改变界面目标数据时数据源会发生变化,改变数据源时界面显示的目标数据会发生变化。前者的实现十分简单,只需要将后台数据属性添加上getter和setter,在前台xaml绑定相应的数据属性即可,当修改界面的目标数据时,监控到后台数据也发生了相应的变化。需要额外的效果可以参考上述五种绑定模式。而要使目标数据随着数据源的改动而刷新,除了直接更改界面目标数据外,还可以实现后台直接对数据源的修改直接更新到数据上,此时就需要借助一些其他方法达到目的。
- 方法一:INotifyPropertyChanged接口
是绑定最常用到也是最基本的接口方法。首先在需要用到的cs文件中添加System.ComponentModel命名空间,在需要实现数据绑定的类后实现INotifyPropertyChanged接口,在需要绑定的属性的setter,getter中添加PropertyChanged.Invoke方法即可,代码如下:
public event PropertyChangedEventHandler PropertyChanged;
private string title = "App";
public string Title
{
get { return title; }
set
{
title = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Title"));
}
}
}
还有另外一种写法,实现接口后添加NotifyPropertyChanged方法,在setter中触发该方法即可,代码如下:
private string title = "App";
public event PropertyChangedEventHandler PropertyChanged;
public string Title
{
get { return title; }
set
{
title = value;
if (this.PropertyChanged != null)
{
this.title = value;
NotifyPropertyChanged("Title");
}
}
}
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
- 方法二:NuGet中的PropertyChanged.fody包
如果项目较复杂,需要绑定的数据源太多,那么实现INotifyPropertyChanged就显得十分复杂,需要重复很多次getter和setter,代码量巨大。此时可以用NuGet中的PropertyChanged.fody包,使得代码看起来十分简洁。首先在NuGet中下载Fody包,安装完成后在要用到的项目中cs项目中添加PropertyChanged命名空间,在需要绑定的类前添加AddINotifyPropertyChangedInterface特性(Atrribute),getter和setter无需修改
代码如下:
[AddINotifyPropertyChangedInterface]
public class MainWindowViewModel
{
public string Title { get; set; } = "App";
//后续省略
}
- 方法三:Prism框架中的BindableBase
在使用MVVM的Prism框架时,自动生成的view和viewmodel文件会一一对应,并且相应的viewmodel文件会继承BindableBase(存在 Prism.Mvvm命名空间中),这是框架内部已经封装好的类,该类已经实现了INotifyPropertyChanged接口,继承后无需做过多处理,添加需要绑定的数据源时可使用快捷代码段propp自动生成可绑定交互的数据源。代码如下:
private string title = "App";
public string Title
{
get { return title; }
set {SetProperty(ref title ,value);}
}
以上是目前我所用到的绑定的后台编辑方法,前台的xaml直接绑定后台数据即可,如果需要其他效果可以参考Binding的其他属性,例如Mode,NotifyOnTargetUpdated等等后续使用再详细描述