c# - 可观察集合

标签 c# wpf observablecollection

我有一个绑定(bind)到 ObservableCollection<MyEntity> 列表的 WPF 对话框类型。在对话框中,我希望仅当对 ObservableCollection<MyEntity> 进行更改时才启用“确定”按钮列表 - 包括从列表中添加/删除项目以及修改列表中的单个项目。

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

我不知道如何做的是修改单个项目时。比如,MyEntity.Name="New Value",MyEntity 类需要实现什么接口(interface)才能使其“可观察”?

最佳答案

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;
}

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

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

  • 此方法更笨重且有异味....有一个外部对象监听更改(通过订阅每个对象上的 PropertyChanged 事件),然后该外部监听器可以启用“确定”按钮(通过数据绑定(bind)或直接设置)。

关于c# - 可观察集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731941/

相关文章:

javascript - 为什么在加载 View 和单击 ASP.NET MVC 中的 Html.ActionLink 之间,我的 routeValues 变量会发生变化?

c# - 调试自动属性

c# - 为什么多值转换器不起作用

java - 如何解决编辑条目和新条目的问题并反射(reflect)条目列表中的更改

c# - Realm + Xamarin 表单更新查询

mvvm - UWP 自定义 ListView 向下滚动

c# - 在 C# 中将 DataGridView DataSource 设置为 DataTable 很慢

c# - 动态调用时出现 RuntimeBinderInternalCompilerException

wpf - wpf中如何实现旋转表格效果

wpf - 在WPF文本框中绑定(bind)单元标签