Использование INotifyPropertyChanged в WPF - PullRequest
3 голосов
/ 26 апреля 2011

Привет, я пытаюсь использовать NotifyPropertyChanged, чтобы обновить все места, где я привязываю свойство.Для того, что я искал, INotifyPropertyChanged указывается в этих случаях.

Так что мне нужна помощь, потому что я не понимаю, в чем я здесь не прав.И я действительно не знаю, что делать с событием PropertyChange.Мой вопрос об этом, когда он меняется?Что мне еще с ним сделать?

Datagrid:

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

Пример, когда я изменяю свое свойство 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 ]

2 голосов
/ 26 апреля 2011

Получение обработчика не позволяет обработчику события переходить в нуль после того, как вы проверите для нуля, а проверка для нуля не даст вам получить исключение NULL, если нет обработчиков событий.

Причина, по которой ваш PropertyChanged равен нулю, заключается в том, что к нему не подключены обработчики событий. Причина, по которой к нему не прикреплены обработчики, заключается в том, что вы не привязали свой объект ни к чему (что позаботится о добавлении обработчика) или вы не добавили обработчик к нему (если вы хотите наблюдать его по какой-то другой причине) , Как только ваш объект создан, вам нужно где-то привязать его.

2 голосов
/ 26 апреля 2011

класс DataTest должен быть DataContext для привязки. Вы можете установить это в программном коде (или множестве других способов, но для простоты - просто сделайте это в программном коде)

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

Затем, с помощью «Source» набора Binding, вы можете указать «Path», чтобы ваш xaml выглядел так:

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

Теперь, если свойство 'Categories' изменяется в коде, написанный вами код NotifyPropertyChanged сообщит Binding, что, в свою очередь, будет обращаться к общедоступному получателю для свойства и обновлять представление.

0 голосов
/ 26 апреля 2011

Вы делаете все, что должны. Событие - это просто особый вид делегата. Вы объявляете это, вы вызываете это, клиенты подписываются на это. Это все, что нужно сделать.

...