C# 在WPF中使用InotifyProperty更改

C# 在WPF中使用InotifyProperty更改,c#,wpf,binding,inotifypropertychanged,C#,Wpf,Binding,Inotifypropertychanged,您好,我正在尝试使用NotifyPropertyChanged更新绑定属性的所有位置。对于我所搜索的内容,INotifyPropertyChanged将显示在此案例中 所以我需要帮助,因为我不明白我到底做错了什么。我真的不知道如何处理PropertyChange事件。我的问题是,他什么时候改变?我跟他还有什么关系 数据网格: <ListView Name="listView" ItemsSource="{Binding Categories}"/> 我的班级: public cla

您好,我正在尝试使用NotifyPropertyChanged更新绑定属性的所有位置。对于我所搜索的内容,INotifyPropertyChanged将显示在此案例中

所以我需要帮助,因为我不明白我到底做错了什么。我真的不知道如何处理PropertyChange事件。我的问题是,他什么时候改变?我跟他还有什么关系

数据网格:

<ListView Name="listView" ItemsSource="{Binding Categories}"/>
我的班级:

public class DataTest : INotifyPropertyChanged
{
    private DataView categories;

    public event PropertyChangedEventHandler PropertyChanged; //What i have to do with this?

    private void NotifyPropertyChanged(string str)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(str));
        }
    }

    public DataView Categories
    {
        get { return categories; }
        set 
        {
            if (value != categories)
            {
                categorias = value;
                NotifyPropertyChanged("Categories");
            }
        }
    }
}
我的InotifyCollection类已更改:

public class DataTest : INotifyCollectionChanged
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    private void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, e);
        }
    }

    public DataView Categories
    {
        get { return categories; }
        set 
        {
            if (value != categories)
            {
                categories = value;
                OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, Categories));
            }
        }
    }
}
但是为什么PropertyChanged总是空的???我还得做点什么,但我不知道该做什么


提前谢谢

你正在做你该做的一切。事件只是一种特殊的委托。你声明它,你调用它,客户订阅它。仅此而已。

获取处理程序可防止事件处理程序在检查null后变为null,如果没有事件处理程序,则检查null将防止获取null异常


PropertyChanged
为null的原因是没有附加任何事件处理程序。没有附加处理程序的原因是您没有将对象绑定到任何对象(这将负责添加处理程序),或者您没有向其添加处理程序(如果您出于其他原因希望观察它)。创建对象后,需要将其绑定到某个位置。

对于绑定,
DataTest
类需要是
DataContext
。您可以在“代码隐藏”中设置此选项(或者使用多种其他方法,但为了简单起见,只需在“代码隐藏”中设置即可)

然后,使用绑定集的“源”,您可以指定“路径”,因此您的xaml如下所示:

<ListBox ItemsSource="{Binding Categories}" />


现在,如果属性“Categories”在代码中发生了更改,那么您编写的
NotifyPropertyChanged
代码将提醒绑定,绑定将访问该属性的公共getter并刷新视图。

Ok,我的案例如下。。。我更新了那个DataView,我做了一个查询,比如把数据放到DataView中,属性的值已经改变了,但是PorpertyChanged事件总是空的!!为什么?我必须做一些更多的与财产改变,但我不明白什么,在哪里。。。这是我的问题。假设我单击了一个按钮,然后更改了该属性的值,接下来要做什么?如果
PropertyChanged
为空,则表示没有客户端侦听该事件。如果没有更多的信息,很难说为什么会这样。这和绑定有关吗?我在不止一个地方绑定属性,所以我认为这与绑定无关。我必须做更多的事情,但我想不出是什么。。。我必须像这样做“dtTest.PropertyChanged=?”?用一个演示问题的小示例编辑您的问题。我编辑了我的按钮单击事件,以提供更好的解释。所以我认为我必须将一些处理程序附加到我的PropertyChanged,或者在我的窗口中对其进行处理,这样他就不会为NULL,对吗?但是什么?在这种情况下我必须做什么?你想在你的控制下发生什么?在大多数情况下,您不会在单击按钮后创建绑定,而是在XAML中创建绑定。如果您有一个列表框,并且希望将类别绑定到该列表框,则假设您的DataContext设置为要填充ItemsSource的DataTest对象。很可能您需要有某种方式将当前DataTest公开给XAML(可能是DependencyProperty)并基于该属性进行绑定。我从未使用过Dependency属性。我对它们有一点概念,但我从未使用过。我在下面的另一个答案的评论中暴露了我的真实情况。我不需要对这个事件做任何事情?不需要初始化吗?或者当属性开始绑定到任何地方时,他丢失了空值?@Miguel试试看-主要的是,为要绑定的对象设置DataContext,或者最好是父对象,如窗口。然后,是的,装订将为您完成工作;您不需要手动创建处理程序!我尝试了您的建议以及上面的解释,并在NotifyPropertyChanged中设置了一个断点,以检查PropertyChanged是否为null,但它保持为null。好的,还有几件事。1.确保支持字段拼写正确,在示例代码的不同位置有“categories”和“categorias”(但这可能只是这个问题上的一个输入错误?)。将断点放在属性设置器上,因为在运行代码时(单击按钮后),绑定将被配置,并且PropertyChanged事件将为非null。可能是您在设置绑定之前过早中断。事件始终为null。当我更改属性的值时,事件刚刚启动,并且始终为null。你确定我不必对我的财产进行抵押吗?
public MainWindow() // constructor
{
    this.DataContext = new DataTest();
}
<ListBox ItemsSource="{Binding Categories}" />