假设视图模型正确实现,在后面的代码中对视图模型(未指定类型)的名为foo的属性进行更改的最佳方法是什么INotifyPropertyChanged?
通常可以绑定控件元素来查看模型属性,一切正常.但在这种情况下,这还不够,我需要在属性更改时执行一些c#行.
可以监听DataContext的相应事件,但是,我还处理了DataContext本身的更改.另一种可能的解决方案是DependencyProperty在代码隐藏文件中引入一个.但是有没有更短的方式?
Kel*_*all 13
我建议尽可能避免这种情况.如果有必要,请订阅该PropertyChanged活动.
我会将此代码放在代码隐藏构造函数中.
INotifyPropertyChanged viewModel = (INotifyPropertyChanged)this.DataContext;
viewModel.PropertyChanged += (sender, args) => {
if (!args.PropertyName.Equals("foo"))
return;
// execute code here.
};
Run Code Online (Sandbox Code Playgroud)
可维护性提示如果您确定数据上下文是具有该属性的类型,则转换为该类型并使用nameof运算符而不是魔术字符串.
编辑(对datacontext更改做出反应)
您应该能够订阅DataContextChanged事件来处理数据上下文中的更改.
INotifyPropertyChanged previous;
// constructor
public SomeCodeBehindClass()
{
previous = (INotifyPropertyChanged)this.DataContext;
DataContextChanged += (sender, args) => SubscribeToFooChanges((INotifyPropertyChanged)args.NewValue);
SubscribeToFooChanges(previous);
}
// subscriber
private void SubscribeToFooChanges(INotifyPropertyChanged viewModel)
{
if (previous != null)
previous.PropertyChanged -= FooChanged;
previous = viewModel;
if (viewModel != null)
viewModel.PropertyChanged += FooChanged;
}
// event handler
private void FooChanged (object sender, PropertyChangedEventArgs args)
{
if (!args.PropertyName.Equals("foo"))
return;
// execute code here.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3498 次 |
| 最近记录: |