2012-09-21 41 views
0

我是一個總新手,剛剛學習DataContext和MVVM模型的基礎知識。我現在已經有了一個綁定到視圖模型對象的網格,該對象實現了INotifyPropertyChanged,但看起來UpdateSourceTrigger(所有WPF教程告訴我使用的)不適用於WinRT/Metro Style應用程序!如何在WinRT中使用INotifyPropertyChanged?

那麼我該如何實現INotifyPropertyChanged?

我在我的繫繩在這裏結束。我花了幾乎整整一天的時間在最基本的應用程序示例上,只是試圖在點擊某個內容後更新網格。我已經成功地做到這一點,到目前爲止的唯一方法是創建視圖模型的一個全新的實例,並重新分配DataContext知道是錯誤的

UPDATE:

我已經取得了一些進展,但事情變得非常奇怪。我有一個視圖模型,帶有一個通用的項目列表。項目列表通過一個PropertyChangedEventHandler連接起來。如果我用一個新的集合替換整個集合,那麼listview會更新。

model.Items = new List<DataItem>{ new DataItem{ Title = "new item" }}; 

這會產生一個包含上述項目的項目列表。不過,如果我嘗試添加一個項目,什麼也沒有發生

model.Items.Add(new DataItem{ Title = "added item" }); 

我也嘗試創建它增加了一個項目,專門燒製的PropertyChanged的方法,但也不起作用

這裏的地方會很奇怪。接下來我嘗試了這段代碼。

model.Items.Add(new DataItem { Title = "added item" }); 
model.Items = new List<DataItem> { new DataItem { Title = "new item" }}; 

這將導致兩個項目列表:

- new item 
- added item 

怎麼能這樣呢?代碼說,「添加一個項目」,然後「替換整個列表」,但它以相反的順序執行?

更新2:

的建議,這實際上已經解決了原來的問題,我已經切換到的ObservableCollection。我現在可以添加一個項目,並顯示在列表中。

但是,新奇怪的行爲仍然有效。重置集合之前添加的項目會附加到新集合的末尾。爲什麼我的代碼以相反的順序執行?

+0

UpdateSourceTrigger具有絕對與INotifyPropertyChanged無關... –

+0

@ roryok對於這個問題,最好接受一個答案,並用你的其他問題開一個新問題,這樣它就會保持孤立。 –

回答

3

您需要實現接口並在您關心的給定屬性發生變化時發出通知。

 public event PropertyChangedEventHandler PropertyChanged; 

     public string CustomerName 
     { 
      get 
      { 
       return this.customerNameValue; 
      } 

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

請記住,對於一個集合,你應該使用一個ObservableCollection,因爲它會照顧INotifyCollectionChanged被解僱,當一個項目被添加或刪除。

我會建議儘可能將您的樣本回縮。不要從DataGrid開始,而應該從TextBoxButton開始,其中Button強制更改ViewModel,然後再反映在UI上。

3

代碼取自here

這是最好的實現它實現了它這樣一個父類:在你的財產

public class NotifyPropertyChangedBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

,然後在子類(即視圖模型)做這樣的事情:

public class MyViewModel : NotifyPropertyChangedBase 
{ 
    private string _name; 
    public string Name { 
     get{ return _name; } 
     set{ 
     _name = value; 
     RaisePropertyChanged("Name"); 
     } 
    } 
} 
相關問題