2009-06-05 25 views
4

在視圖模型中,我有一個名爲「MyCollection」的類型爲「ClassA」的項目的集合。 ClassA有一個名爲「IsEnabled」的屬性。WPF - OnPropertyChanged集合中的屬性

class MyViewModel 
{ 
    List<ClassA> MyCollection { get; set; } 

    class ClassA { public bool IsEnabled { get; set; } } 
} 

我的看法有一個數據網格綁定到MyCollection。每行都有一個按鈕,其「IsEnabled」屬性綁定到ClassA的IsEnabled屬性。

當在視圖模型的變化,使得在MyCollction列表中的一個特定項目需要低頭條件被禁用,我設置IsEnabled屬性設置爲false:

MyCollection[2].IsEnabled = false; 

我現在要通知由此看來使用OnPropertyChanged事件更改,但我不知道如何引用集合中的特定項目。

OnPropertyChanged("MyCollection"); 
OnPropertyChanged("MyCollection[2].IsEnabled"); 

都不起作用。

如何通知此更改視圖?謝謝!

回答

12

ClassA的需要執行INotifyPropertyChanged:

class ClassA : INotifyPropertyChanged 
{ 
    private bool _isEnabled; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 
     set 
     { 
      if (value != _isEnabled) 
      { 
       _isEnabled = value; 
       OnPropertyChanged("IsEnabled"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

編輯:和使用像斯科特一個ObservableCollection說

EDIT2:由調用PropertyChanged事件較短

+0

則不需要的ObservableCollection - 執行INotifyPropertyChanged的就足夠了。謝謝! – 2009-06-05 14:55:54

6

而不是使用列表,請嘗試使用ObservableCollection。此外,修改您的ClassA,以便它實現INotifyPropertyChanged,特別是對於IsEnabled屬性。最後,修改您的MyViewModel類,以便它還實現INotifyPropertyChanged,特別是MyCollection屬性。