1

我有一个 WPF 工具包DataGrid绑定到我ObservableCollectionCar视图模型中的一个。 Car有一个PropertyChanged事件,并且它的两个字符串属性中的每一个的设置器都会触发该事件。我还将网格的SelectedItem属性绑定到类型视图模型中的属性Car,也称为SelectedItem.

在与网格相同的窗口上,我有addmodify的按钮deleteAddmodify打开一个带有两个文本框的对话框窗口,每个Car属性一个。 Delete只显示一个确认对话框,然后进行删除。

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

我尝试更改SelectedItem视图模型中的值以及直接更改集合上的项目。

我究竟做错了什么?

4

2 回答 2

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

}
于 2009-11-25T05:27:57.113 回答
0

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

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

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

使用这种方法还有一个好处是分组和排序内置在视图中。

于 2009-11-25T05:20:15.490 回答