2009-12-29 86 views
0

我一直在爭取讓數據綁定在WPF中工作一個多星期。我在這裏獲得了關於DataContext的寶貴幫助,並且我確實通過DependencyProperties獲得了數據綁定。在我學習數據綁定的同時,我遇到了許多關於INotifyPropertyChanged的討論,以及它在很多方面比DP更好。我想我會試一試並嘗試一下。使用INotifyPropertyChanged而不是DependencyProperties進行數據綁定

我使用喬希史密斯的基礎ViewModel類和我的ViewModel派生自它。但是,我在數據綁定工作方面遇到了一些麻煩,希望有人能告訴我哪裏出錯了。

在我的ViewModel類中,我有一個ObservableCollection<string>。在我的GUI,我有一個綁定到該OC組合框,即

<ComboBox ItemsSource="{Binding PluginNames}" /> 

的GUI的DataContext設置爲視圖模型,即

private ViewModel _vm; 

public GUI() 
{ 
    InitializeComponent(); 
    _vm = new ViewModel(); 
    this.DataContext = _vm; 
} 

和視圖模型具有名爲OC「PluginNames」 :

public class ViewModel 
{ 
    public ObservableCollection<string> PluginNames; // this gets instantiated and added to elsewhere 
} 

當加載GUI時,會調用一個方法來實例化OC並向其添加插件名稱。 OC被修改後,我致電RaisePropertyChanged("PluginNames")。我期待着,因爲WPF數據綁定模型認識到INotifyPropertyChanged,這就是我需要做的一切,它會「神奇地工作」,並使用已加載的插件更新組合框項目......但事實並非如此。

有人可以指出我在這裏做了什麼錯嗎?謝謝!

更新:我不知道爲什麼,但現在,而不是做任何明顯的更新,它沒有找到屬性。我認爲我很愚蠢,並且在某個地方失去了重要的一步。

回答

4

看起來你已經暴露了領域而不是財產。綁定適用於只是性能......將它改爲:

public class ViewModel 
{ 
    public ObservableCollection<string> PluginNames {get; private set;} 
} 
+1

請勿使用自動屬性 ​​- 它們不會引發PropertyChanged事件。 – itowlson 2009-12-29 19:56:38

+0

絕對正確。哎呀!我最終會在這件事上變得更好。 :) – Dave 2009-12-29 19:57:20

+0

在這裏接受最古老的正確答案是正確的禮節嗎?我假設如此。 – Dave 2009-12-29 19:58:11

6

當你和INotifyPropertyChanged工作,有兩件事情:

  1. 你需要使用屬性,而不是場
  2. 當您設置hte屬性時,您應該始終引發屬性已更改的事件。

你要返工此所以它看起來更像是:

private ObservableCollection<string> pluginNames; 
public ObservableCollection<string> PluginNames 
{ 
    get { return pluginNames; } 
    set { 
     this.pluginNames = value; 
     RaisePropertyChanged("PluginNames"); // This should raise the PropertyChanged event - use whatever your VM class does for this 
    } 
} 

這應該引起一切重新填充。

+2

事實上,可能沒有理由在該屬性上設置一個setter,因爲它是一個集合(並且是可觀察的集合)。 – 2009-12-29 19:55:45

+0

哦jeez。那就對了!謝謝。對不起,我的愚蠢。 – Dave 2009-12-29 19:56:00

+1

是的 - 但他故意提到他是在運行時設置它,所以我將其包含在內。 – 2009-12-29 20:03:25

相關問題