2012-03-20 72 views
0

我想從數據庫中提取數據以顯示到ComboBox中,然後允許用戶從該ComboBox中選擇值並將它們添加到ListBox(通過添加/刪除按鈕)。因爲它實現了INotifyPropertyChanged(和CollectionChanged),我能否使用ObservableCollections來讓數據庫值綁定到ComboBox?對不起,如果這是一個基本的問題,我大約一個月前開始學習WPF。使用ObservableCollection實現INotifyPropertyChanged

我讀過了Sacha Barber的article(做得非常好)。

我查閱了關於ObservableCollection的MSDN頁面。

使用ObservableCollection vs List(我知道它沒有實現INotifyPropertyChanged)會有什麼優點/缺點?

回答

1

如果您的ComboBox中的項目不改變(即不添加/刪除/更新的項目),然後List將可能是你的需要確定(ObservableCollection將太)如果您手動通知您的List財產改變時,你影響它。

public List<X> MyList 
{ 
    get 
    { 
     ... 
    } 

    set 
    { 
     if (... != value) 
     { 
      ... = value; 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs("MyList")); 
      } 
     } 
    } 
} 

.... 

this.MyList = new List<X> { new X(...), new X(...) }; 

如果您打算添加/刪除或在您的組合框更新項目(不創建一個新的MyList對象,即使用this.MyList.Add(...)),然後用ObservableCollection即能通知集合時被更新(因此它可以更新綁定)。

+0

我打算更新綁定到組合框的列表,謝謝!一個問題:在你的例子中,列表是否必須實現INotifyPropertyChanged? 即公開列表 MyList:INotifyPropertyChanged – Ryan 2012-03-20 16:25:19

+0

在該示例中,列表本身不實現'INotifyPropertyChanged'。它是包含'List'類型屬性的類。 – ken2k 2012-03-20 16:27:23

2

你可能想要注意的東西。

請勿將ObservableCollection的INotifyPropertyChanged實現與其包含的實現混淆。

如果ObservableCollection中的某個對象的其中一個屬性發生更改,UI將不會反映它,除非該對象也實現INotifyPropertyChanged。不要指望ObservableCollection爲你處理這件事。

+0

好吧,如果我有一個自定義類,其中有幾個屬性存儲在observablecollection中,那麼observablecollection將不知道這些屬性之一是否發生了更改,除非該自定義類實現了INotifyPropertyChanged?但是,如果可觀察的集合只是持有永不改變的字符串,那麼這不是一個問題,對嗎?謝謝。 – Ryan 2012-03-20 16:32:57

+0

是的,這兩種說法都是正確的。 – Khan 2012-03-20 16:34:37

相關問題