代码之家  ›  专栏  ›  技术社区  ›  Mark Bostleman

无法获取要更新的数据报

  •  1
  • Mark Bostleman  · 技术社区  · 15 年前

    我有一个WPF工具包 DataGrid 绑定到 ObservableCollection 属于 Car 在我的视图模型中。 小型车 有一个 PropertyChanged 事件及其两个字符串属性中的每一个的setter都将激发该事件。我还有网格 SelectedItem 绑定到类型的视图模型中的属性的属性 小型车 也称为 选择项目 .

    在与网格相同的窗口上,我有用于 add , modify delete . Add 修改 打开带有两个文本框的对话框窗口,每个文本框一个 小型车 财产。 Delete 只显示一个确认对话框,然后执行删除操作。

    用于 添加 删除 ,我添加或删除 可观测采集 网格会按预期进行自我更新。然而,对于 修改 它没有。首先,我的 小型车 没有使用 属性更改 经过一些搜索,我发现当单个项目的属性发生变化时,网格需要更新。但现在我用 属性更改 ,网格仍然不更新。

    我试图改变 选择项目 在我的视图模型中,以及直接更改集合中的项。

    我做错什么了?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Josh    15 年前

    确保正在实现InotifyPropertyChanged,而不仅仅是引发PropertyChanged事件。另外,在引发propertychanged时,必须将“this”作为发送方传递,否则WPF将忽略该事件。

    下面是一个实现InotifyPropertyChanged的简单基类。

    public class Person : INotifyPropertyChanged {
    
        private string name;
    
        public string Name {
            get { return name; }
            set { 
                if (name != value) {
                    name = value;
                    OnPropertyChanged("Name");
                }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName) {
            var handler = PropertyChanged;
            if (handler != null) {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
    }
    
        2
  •  0
  •   Muad'Dib    15 年前

    听起来像是可观察收集的经典问题。ObservableCollection只通知其自身的添加、删除等。它不会通知您存储在其中的任何内容的属性更改。这就是添加/删除操作按预期工作的原因。

    您应该做的是使用CollectionView并绑定到它:

    ObservableCollection<MyObject> myCollection = new ObservableCollection<MyObject>();    
    ICollectionView view = CollectionViewSource.GetDefaultView(myCollection);
    

    使用这种方法也有利于将分组和排序内置到视图中。

    推荐文章