在WPF中使用INotifyPropertyChanged

时间:2011-04-26 02:22:40

标签: c# wpf binding inotifypropertychanged

您好我正在尝试使用NotifyPropertyChanged来更新我绑定属性的所有位置。对于我搜索过的内容,INotifyPropertyChanged会显示在这种情况下。

所以我需要帮助,因为我不明白我在这里有什么不对。我真的不知道如何处理PropertyChange事件。我的问题是,当他改变时?我和他有什么关系?

的Datagrid:

<ListView Name="listView" ItemsSource="{Binding Categories}"/>

我更改“我的类别”属性时的示例:

DataTest dtTest = new DataTest();

public MainWindow()
{
    InitializeComponent();
    this.DataContext = dtTest;
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
    //Here i pick up a string from a textBox, where i will insert in a Table of my DB,
    //Then i will do a query to my Table, and i will get a DataTable for example
    //Then i just put the contents into the DataView, so the value have changed.
    dtTest.Categories = dtTable.DefaultView;
    dtTest = dtTable.defaultView; (this only an example, i don't this for real.)
    //What i have to do now, to wherever i am binding (DataGrid, ListView, ComboBox)
    //the property to the new values automatically being showed in all places?
}

我的班级:

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");
            }
        }
    }
}

我的班级有INotifyCollectionChanged:

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 ???我必须做更多的事情,但我不知道是什么。

提前致谢!

3 个答案:

答案 0 :(得分:2)

获取处理程序会阻止事件处理程序在检查null之后变为null,并且检查null将阻止在没有事件处理程序时获得null异常。

PropertyChanged为空的原因是没有附加事件处理程序。没有附加处理程序的原因是你没有将你的对象绑定到任何东西(它将负责添加一个处理程序),或者你没有为它添加一个处理程序(如果你想通过其他原因观察它) 。创建对象后,需要将其绑定到某处。

答案 1 :(得分:2)

DataTest类必须是绑定的DataContext。您可以在代码隐藏中设置它(或者无数其他方式,但为了简单起见 - 只需在代码隐藏中执行此操作)

public MainWindow() // constructor
{
    this.DataContext = new DataTest();
}

然后,使用Binding集的'Source',您可以指定'Path',因此您的xaml看起来像这样:

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

现在,如果在代码中更改了属性'Categories',则您编写的NotifyPropertyChanged代码将提醒Binding,Binding将访问该属性的公共getter并刷新视图。

答案 2 :(得分:0)

你正在做你需要做的一切。事件只是一种特殊的代表。你声明它,你调用它,客户订阅它。这就是它的全部内容。