对后面代码中视图模型属性的更改做出反应

Mar*_*ker 7 c# wpf mvvm

假设视图模型正确实现,在后面的代码中对视图模型(未指定类型)的名为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)