2012-01-24 3 views
16

У меня есть datagrid, который привязан к ObservableCollection<Product>. Когда сетка обновляется, это автоматически обновляет объект Product в моей коллекции.Как определить, изменился ли элемент в моем ObservableCollection

Что я хочу сделать сейчас, это иметь хоть что-то вроде того, что срабатывает, когда обновляется какой-либо объект в коллекции. -или- какая-то привязка к коллекции, которая вернет true/false depedant, если какой-либо продукт имеет был обновлен.

Общая цель заключается в том, чтобы в моем главном окне была кнопка сохранения, которая отключена, если в мою коллекцию не были внесены изменения и включена, если были сделаны изменения.

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

Кроме того, если я реализую этот интерфейс в своем классе продукта, я не вижу, как мой пользовательский интерфейс может контролировать каждый продукт в коллекции - или он может?

+1

См. здесь: http: // stackoverflow.com/questions/1427471/observablecollection-not-noticing-when-item-in-it-changes-even-with-inotifyprop – SwDevMan81

+1

Я использую это: http://stackoverflow.com/questions/8490533/notify-observablecollection -when-item-changes – Noich

ответ

1

Логика должна идти в вашей модели (класс продукта). Чистый подход заключается в том, чтобы выставлять IsDirty свойство (подкрепленное полем) в вашей модели.

И ваш ViewModel имел бы привязку команды с CanSave, проверяя внутреннюю коллекцию, и возвращает true, если любой из элементов в коллекции IsDirty=true.

0

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

Однако, я думаю, вам не нужно делать все это, чтобы выяснить, изменилась ли ячейка в вашей сетке. Я думаю, что вы можете сделать что-то вроде того, что они делают здесь вместо:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43

2

Просто используйте ObservableCollection. У него есть событие под названием CollectionChanged. Если вы зарегистрируете его, вы можете делать то, что хотите. Пример:

ObservableCollection<string> strings = new ObservableCollection<string>(); 
strings.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(changed); 
strings.Add("Hello"); 
strings[0] = "HelloHello"; 

И:

private void changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) 
{ 
    //You get notified here two times. 
} 
+24

Несмотря на документацию MSDN, CollectionChanged не запускается при изменении объектов в коллекции. Только когда сам сборщик имеет объекты, добавленные или удаленные. –

9
  • Реализовать INotifyPropertyChanged в вашем Product класса с уведомлением для каждого свойства.
  • Внесите INotifyPropertyChanged в ваш viewmodel.
  • Добавить объект IsDirty к вашему ViewModel (с уведомлением через INotifyPropertyChanged.
  • В вашей ViewModel, подписаться на CollectionChanged

    public YourViewModel() 
    { 
        ... 
        YourCollection.CollectionChanged += YourCollection_CollectionChanged; 
        ... 
    } 
    
    private void YourCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) 
    { 
        if (args.OldItems != null) 
         foreach(var oldItem in args.OldItems) 
          oldItem.PropertyChanged -= YourItem_PropertyChanged; 
    
        if (args.NewItems != null) 
         foreach(var newItem in args.NewItems) 
          newItem.PropertyChanged += YourItem_PropertyChanged; 
    } 
    
    private void Youritem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args) 
    { 
        IsDirty = true; 
    } 
    
  • Теперь вы можете привязать к IsDirty свойству вашей ViewModel, например, вы можете связывать Button.IsEnabled собственности непосредственно к нему

+0

Это должно быть установлено как ответ. – Oystein

Смежные вопросы