检测datacontext上的属性更改

时间:2012-12-09 06:31:25

标签: c# wpf datacontext inotifypropertychanged

另一个问题是克莱门在这里的答案:DataContext values in view code behind。如果使用此方法,此时是否可以检测VM上的属性更改?这些都是通过INotifyPropertyChanged正确实现的。

var viewModel = DataContext as MyViewModel;
//How would one detect a property change on viewModel?
//Tried viewModel.PropertyChange which doesn't fire.

2 个答案:

答案 0 :(得分:4)

我认为你一定做错了,你在帖子中没有提到。以下代码按预期工作,并将MyTestPropertyName打印到控制台窗口。

public partial class MainWindow : Window
{

    public MainWindow()
    {
        DataContext = new MyViewModel();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        MyViewModel viewModel = DataContext as MyViewModel;
        viewModel.PropertyChanged += MyPropertyChangedEventHandler;
        viewModel.NotifyPropertyChanged();
    }

    private void MyPropertyChangedEventHandler(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine(e.PropertyName);
    }

}

public class MyViewModel : INotifyPropertyChanged
{
    public void NotifyPropertyChanged()
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs("MyTestPropertyName"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

应该注意的是,这是可怕的设计,并且仅作为概念证明,您确实可以在代码隐藏中订阅ViewModel上的事件。

答案 1 :(得分:1)

您需要订阅每个依赖项属性的PropertyChanged事件(即实现INotifyPropertyChanged的属性),或者修改您的MyViewModel类以从setter中引发事件您感兴趣的属性(依赖关系或其他),然后订阅公共事件。