2011-05-04 40 views
1

這是我的示例代碼,爲什麼PropertyChangedEventHandler屬性爲null?
該列表與列表框綁定,該列表框應訂閱該事件。不應該嗎?爲什麼INotifyPropertyChanged的事件PropertyChangedEventHandler始終爲空?

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> 
+0

你是說列表框正在顯示,但你的事件仍然爲空? – Gabe 2011-05-04 15:03:09

+0

@Gabe,列表顯示正常,但var h = this.PropertyChanged;爲空,爲什麼?我該如何提高事件 – 2011-05-04 15:40:37

+0

因此,即使在列表顯示之後,「PropertyChanged」仍然爲空? – Gabe 2011-05-04 15:45:40

回答

1

大概是因爲ListBox中已經沒有機會來渲染並開始監聽更改事件呢。

當我測試以下PropertyChangedlistbox1_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

我不明白你的答案。你是說我不能將它綁定到Window的構造函數中的數據? – 2011-05-04 14:53:12

+0

@Mark您可以在構造函數中綁定 - 事件爲null的原因僅僅是因爲在您檢查null的位置在第一個框首先呈現自身之前,因此它尚未訂閱該事件。即事件爲空是正常的。 – Justin 2011-05-04 15:26:27

+0

是的,如果我把它放在按鈕的點擊事件中: 'Person p = new Person {Name =「Andy」,Age = 30}; list [0] .MyData = p;' 它的工作原理 – 2011-05-04 15:44:28

0

在您提供的代碼中,將訂閱PropertyChanged事件處理程序。你爲什麼認爲情況並非如此?

變化這樣會正確更新列表框:

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

記住,你的數據類不支持物業通知的各個屬性, 所以下面的變化將不會更新列表框。

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