WPF - 集合中属性的OnPropertyChanged

时间:2009-06-05 14:30:20

标签: c# .net wpf mvvm

在视图模型中,我有一组名为“ClassA”的项目,名为“MyCollection”。 ClassA有一个名为“IsEnabled”的属性。

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事件通知View的变化,但我不知道如何引用集合中的特定项目。

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

两者都不起作用。

如何通知查看此更改?谢谢!

2 个答案:

答案 0 :(得分: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));
    }
}

编辑:并使用像Scott所说的ObservableCollection

EDIT2:调用PropertyChanged事件更短

答案 1 :(得分:6)

不使用List,而是尝试使用ObservableCollection。此外,修改您的ClassA,以便它实现INotifyPropertyChanged,特别是对于IsEnabled属性。最后,修改MyViewModel类,使其实现INotifyPropertyChanged,尤其是对于MyCollection属性。