Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测datacontext上的属性更改_C#_Wpf_Datacontext_Inotifypropertychanged - Fatal编程技术网

C# 检测datacontext上的属性更改

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. 您需要订阅每个依赖项属性(即实现

对于克莱门的完美回答,这里还有一个问题:。如果使用这种方法,是否可以在此时检测VM上的属性更改?通过
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以及可能影响绑定属性值的任何其他方法中引发事件。