C# 检测datacontext上的属性更改
对于克莱门的完美回答,这里还有一个问题:。如果使用这种方法,是否可以在此时检测VM上的属性更改?通过C# 检测datacontext上的属性更改,c#,wpf,datacontext,inotifypropertychanged,C#,Wpf,Datacontext,Inotifypropertychanged,对于克莱门的完美回答,这里还有一个问题:。如果使用这种方法,是否可以在此时检测VM上的属性更改?通过INotifyPropertyChanged正确实现这些功能 var viewModel = DataContext as MyViewModel; //How would one detect a property change on viewModel? //Tried viewModel.PropertyChange which doesn't fire. 您需要订阅每个依赖项属性(即实现
INotifyPropertyChanged
正确实现这些功能
var viewModel = DataContext as MyViewModel;
//How would one detect a property change on viewModel?
//Tried viewModel.PropertyChange which doesn't fire.
您需要订阅每个依赖项属性(即实现
INotifyPropertyChanged
的属性)的PropertyChanged
事件,或者修改MyViewModel
类以从属性(依赖项或其他)的设置器引发事件你有兴趣得到通知,然后订阅公共活动。我想你一定是做错了什么事,而你在帖子中没有提到。以下代码按预期工作,并将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上的事件。感谢Takkara,我理解为什么这是一个糟糕的设计,但不确定如何改进它。我在3D球体上有标记,当用户选择一个标记时,我用一条线将它们连接起来。我正在视图代码中进行直线计算,我的viewmodel知道所选点何时发生了更改,因此问题就出现了。当您像使用viewmodel.NotifyPropertyChanged()一样触发更改时,这会起作用;但是,如果更改是通过UI触发的,那么它似乎不起作用。UI中的按钮单击会触发VM本身的更改通知,但该更改不会反映在viewModel中。PropertyChanged+=MyPropertyChangedEventHandler;这是正确的答案。注意,这是一种糟糕的设计实践。John,我怀疑您只是实现了INotifyPropertyChanged,但没有添加触发事件的代码。仅仅实现接口是不够的。必须从每个绑定属性的setter以及可能影响绑定属性值的任何其他方法中引发事件。