无法获取DataGrid进行更新

时间:2009-11-25 04:35:57

标签: wpf data-binding mvvm datagrid inotifypropertychanged

我的视图模型中有一个WPF工具包DataGrid绑定到ObservableCollection CarCar有一个PropertyChanged事件,其两个字符串属性中的每一个的setter都会触发事件。我还将网格的SelectedItem属性绑定到类型为Car的视图模型中的属性,也称为SelectedItem

在与网格相同的窗口中,我有addmodifydelete的按钮。 Addmodify打开一个包含两个文本框的对话框窗口,每个文本框对应一个Car属性。 Delete只显示一个确认对话框然后执行删除。

对于adddelete,我会添加或删除ObservableCollection中的项目,并且网格会按预期自行更新。但是,对于modify,它没有。首先,我的Car没有使用PropertyChanged,经过一些搜索,我发现当单个项目的属性发生变化时,网格需要更新。但是现在我正在使用PropertyChanged,网格仍然没有更新。

我尝试在视图模型中更改SelectedItem的值,并直接更改集合中的项目。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

确保您正在实施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));
        }
    }

}

答案 1 :(得分:0)

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

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

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

使用此方法还具有在视图中内置分组和排序的优点。