Не удается обновить DataGrid

У меня есть набор инструментов WPF DataGrid, привязанный к ObservableCollection из Car в моей модели представления. Car имеет событие PropertyChanged, и установщики каждого из двух строковых свойств запускают это событие. У меня также есть свойство сетки SelectedItem, связанное со свойством в модели представления типа Car, также называемым SelectedItem.

В том же окне, что и сетка, у меня есть кнопки для add, modify и delete. Add и modify открывают диалоговое окно с двумя текстовыми полями, по одному для каждого свойства Car. Delete просто показывает диалоговое окно подтверждения, а затем удаляет.

Для add и delete я добавляю или удаляю элемент из ObservableCollection, и сетка обновляется, как и ожидалось. Однако для modify это не так. Сначала мой Car не использовал PropertyChanged, и после некоторых поисков я обнаружил, что сетка должна обновляться при изменении свойств отдельного элемента. Но теперь, когда я использую PropertyChanged, сетка по-прежнему не обновляется.

Я попытался изменить значения SelectedItem в моей модели представления, а также напрямую изменить элемент в коллекции.

Что я делаю неправильно?


person Mark Bostleman    schedule 25.11.2009    source источник


Ответы (2)


Убедитесь, что вы реализуете 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));
        }
    }

}
person Josh    schedule 25.11.2009
comment
Спасибо, Джош, я поднимал событие, но не реализовывал интерфейс. Да :) - person Mark Bostleman; 25.11.2009

Звучит как классическая проблема с ObservableCollection. ObservableCollection уведомляет только о добавлении, удалении и т. д. о себе. Он НЕ будет уведомлять об изменениях свойств того, что вы в нем сохранили. Вот почему ваши операции добавления/удаления работают должным образом.

Что вам нужно сделать, так это использовать CollectionView и привязать к нему:

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

Использование этого метода также имеет то преимущество, что группировка и сортировка встроены в представление.

person Muad'Dib    schedule 25.11.2009