4

克莱门在这里的好答案的另一个问题: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.
4

2 回答 2

5

我认为你一定做错了你在帖子中没有提到的事情。以下代码按预期工作,并将 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 上的事件。

于 2012-12-09T06:41:14.697 回答
1

您需要订阅PropertyChanged每个依赖属性(即实现的属性INotifyPropertyChanged)的事件,或者修改您的MyViewModel类以从您有兴趣收到通知的属性(依赖或其他)的设置器中引发事件,并且然后订阅公共事件。

于 2012-12-09T06:35:48.547 回答