2012-07-11 135 views
0

我真的不明白爲什麼以及在後臺發生了什麼,所以請幫助我。 我有一個簡單的ListView:ObservableCollection綁定到列表視圖

<ListView Height="100" HorizontalAlignment="Left" Margin="67,84,0,0" ItemsSource=" 
{Binding Path=ListBinding}" Name="listView1" VerticalAlignment="Top" Width="351" /> 

和按鈕:

<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="162,41,0,0" 
Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 

我在DataContext設置爲我的 「視圖模型」 類:

 InitializeComponent(); 

     this.DataContext = new VM1(); 

現在,如果我初始化在VM1的構造函數obscollection中,綁定起作用,當我使用button1_click函數填充ListBinding時:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    (this.DataContext as VM1).Do(); 
} 

public VM1() 
{ 
    ListBinding = new ObservableCollection<string>(); 
} 

public void Do() 
{ 
    ListBinding.Add("VM1 works 1"); 
    ListBinding.Add("VM1 works 2"); 
} 

但是,如果我在DO()函數初始化它,它不:

public VM1() 
{ } 

public void Do() 
{ 
    ListBinding = new ObservableCollection<string>(); 
    ListBinding.Add("VM1 NOT works 1"); 
    ListBinding.Add("VM1 NOT works 2"); 
} 

我想這個問題的答案可能是一個襯墊,和我想了解「爲什麼」。 謝謝!

回答

1

您沒有列出ListBinding屬性的代碼。 屬性設置器必須調用NotifyOfPropertyChange,這樣綁定纔會更新。 ObservableCollection會自動更新列表更改的內容,而不是整個列表對象。

希望有所幫助。

編輯:這裏是屬性代碼:

private ObservableCollection<string> _listBinding // backing field 
    public ObservableCollection<string> ListBinding 
    { 
     get { return _listBinding; } 
     set { 
      _listBinding = value; 
      NotifyOfPropertyChange("ListBinding"); // let the bindings update 
     } 
    } 
+0

嗨,ListBinding很簡單:公衆的ObservableCollection ListBinding {獲得;組; }當在構造函數中初始化此屬性,然後在Do()函數中添加內容時,綁定工程(列表視圖得到更新),但在Do()函數中初始化時也無法更新...: – user1519074 2012-07-12 05:38:59

+0

就像我說的,需要調用NotifyOfPropertyChange: – jbiddle 2012-07-12 16:12:02

+0

好吧,我明白這一點,謝謝,所以這是正確的方式來做到這一點。但是在這種情況下,問題是,爲什麼綁定在沒有這種setter的情況下工作,如果我在構造函數中初始化它? – user1519074 2012-07-12 17:07:38