比如ViewModel有个属性Name,
private string _Name = string.Empty;
public string Name
{
get { return _Name ; }
set
{
_Name = value;
this.NotifyPropertyChanged("Name");
}
}
View界面上有个TextBox双向绑定Name,
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
当ViewModel初始化时,给Name赋初始值,比如 Name = "ABC";不做其他处理操作.
但当界面文本框修改Name值时,需要做一些处理,比如发消息存数据等等操作.
但ViewModel后台赋值,和VIew中界面修改值调用的都是属性的set方法,set方法中如何判断是ViewModel中的源修改,还是View中的目标修改?
在WPF双向绑定中,set方法无法直接判断修改方是源还是目标。但是可以通过绑定的Mode属性来判断是单向绑定还是双向绑定。如果Mode为TwoWay,则说明是双向绑定,需要更新源和目标;如果Mode为OneWay,则说明是单向绑定,只需要更新目标。
例如,在ViewModel中定义Name属性时,可以添加Mode属性:
private string _Name = string.Empty;
public string Name
{
get { return _Name; }
set
{
if (_Name != value)
{
_Name = value;
OnPropertyChanged("Name");
}
}
}
在XAML中绑定Name属性时,可以设置Mode属性为TwoWay:
<TextBox Text="{Binding Name, Mode=TwoWay}" />
这样,在修改TextBox中的值时,会自动更新ViewModel中的Name属性,反之亦然。在ViewModel中的set方法中,无法直接判断是源还是目标修改了属性值,但是可以通过Mode属性判断是双向绑定还是单向绑定,从而进行相应的处理。