另一个问题是克莱门在这里的答案: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.
答案 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中引发事件您感兴趣的属性(依赖关系或其他),然后订阅公共事件。