Почему событие PropertyChangedEventHandler в INotifyPropertyChanged всегда равно null? - PullRequest
1 голос
/ 04 мая 2011

Это мой пример кода, почему свойство PropertyChangedEventHandler имеет значение null?
список ограничен списком, который должен подписаться на событие. Не так ли?

public class Data<T> : INotifyPropertyChanged where T : class
{
     T _data;

     public T MyData
     {
        get { return _data; }
        set 
        { 
            _data = value;
            this.OnPropertyChanged("MyData");
         }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        var h = this.PropertyChanged;
        if (h != null)
        {
           h(this, new PropertyChangedEventArgs(property));
        }
    }
 }

   class Person
   {
         public string Name { get; set; }
         public int Age { get; set; }
   }

public Window1()
{
    InitializeComponent();

    List<Data<Person>> list = new List<Data<Person>>();                   

    list.Add(new Data<Person> { MyData = new Person { Name = "Sam", Age = 21 } });
    list.Add(new Data<Person> { MyData = new Person { Name = "Tom", Age = 33 } });

    this.DataContext = list;
}
    <Grid>
        <ListBox Name="listbox1"
                 ItemsSource="{Binding}"
                 Style="{DynamicResource lStyle}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" >
                        <Label Width="100" Content="{Binding Path=MyData.Name}"></Label>
                        <Label Width="100" Content="{Binding Path=MyData.Age}"></Label>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Возможно, потому что ListBox еще не имел возможности визуализировать и начать прослушивание событий изменения.

При тестировании следующее PropertyChanged не было нулевым во время изменения внутри listbox1_MouseLeftButtonDown.

Data<Person> p;
public MainWindow()
{
    InitializeComponent();

    List<Data<Person>> list = new List<Data<Person>>();
    this.p = new Data<Person> { MyData = new Person { Name = "Sam", Age = 21 } };
    list.Add(this.p);
    this.DataContext = list;
}

private void listbox1_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    p.DataContext = null;
}
0 голосов
/ 04 мая 2011

В предоставленном вами коде обработчик события PropertyChanged будет подписан.Почему вы думаете, что это не так?

Подобные изменения приведут к корректному обновлению списка:

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData = new Person() { Name = "Bob", Age = 12 };

Помните, что ваш класс Data не поддерживает уведомления о свойствах для отдельных свойств, поэтомуСледующие изменения не обновят список.

List<Data<Person>> list = DataContext as List<Data<Person>>; 
list[0].MyData.Name = "Bob"; 
list[0].MyData.Age = 12;
...