的ObservableCollection

sea*_*717 2 c# wpf observablecollection

我有一个绑定到ObservableCollection<MyEntity>类型列表的WPF对话框.在对话框中,我希望只有在对ObservableCollection<MyEntity>列表进行更改时才启用"确定"按钮- 包括从列表中添加/删除项目以及修改列表中的各个项目.

为了从列表中添加/删除项目,很容易 - 我为CollectionChanged事件实现了一个处理程序.

我不知道怎么办是修改单个项目.比方说,MyEntity.Name ="New Value",MyEntity类需要实现哪些接口才能使其"可观察"?

slu*_*ter 9

MyEntity需要实现INotifyPropertyChanged,然后在发生属性更改时触发PropertyChanged事件.像这样:

public class MyEntity : INotifyPropertyChanged
{
    public bool MyFlag 
    {
        get { return _myFlag; }
        set 
        {
            _myFlag = value;
            OnPropertyChanged("MyFlag");
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的两种方法是:

  • 在对象内部有一个事件监听器,然后在属性发生变化时设置一个IsDirty标志.然后OK按钮绑定到命令(检查ICommand接口的用法),并在命令的CanExecute方法中检查ObservableCollection中的任何对象是否已设置为脏.可以使用简单的LINQ语句完成此检查:myCollection.Any(x => x.IsDirty == true)

  • 这个方法更笨重和臭...有一个外部对象侦听更改(通过在每个对象上订阅PropertyChanged事件),然后外部侦听器可以启用OK按钮(通过数据绑定或直接设置).