Нужно ли использовать IObservable для отслеживания изменений в моей коллекции? - PullRequest
1 голос
/ 22 января 2012

Прочитайте немного о IObservable, и мне интересно, что шаблон даст мне (если что-нибудь) в моем сценарии.

У меня есть приложение WPF с сеткой данных, сетка привязана к IObservableколлекция Product.

ProductList.DataContext = AppState.Current.Products

... где AppState.Current.Products возвращает ObservableCollection<Product>

Мои цели:

  • Отслеживание списка измененныхобъекты
  • Информировать пользовательский интерфейс о том, что объект изменился, чтобы я мог включить кнопку сохранения

Мой класс продукта выглядит примерно так ...

public class Product
{
    string _desc;

    public string Description 
    { 
        get { return _desc; }
        set { _desc = value; } 
    }
}

Теперь, если я обновлю столбец описания в строке в моей сетке, вызывается установщик для Description .Таким образом, я мог бы записать здесь некоторый код, чтобы установить флаг Dirty для своего продукта, который я мог бы затем использовать для запроса списка измененных продуктов, которые необходимо сохранить в БД.

Я думаю, что яМожно ли использовать IObservable для достижения моей второй цели - информирования пользовательского интерфейса об изменении строки?Или есть более простой метод, такой как какое-либо свойство в сетке?

Если я хочу использовать IObservable, я видел примеры, когда продукт выставляет события, на которые можно подписаться.Однако я не хочу подключать обработчики событий ко всем моим объектам.Мне нужно что-то, что обычно говорит мне, когда какой-либо объект в коллекции изменился.

Кроме того, как бы я подключил это уведомление к своему пользовательскому интерфейсу.

Ответы [ 3 ]

3 голосов
/ 22 января 2012

ObservableCollection<Something>, несмотря на название, не имеет ничего общего с IOberservable<Something>.Он реализует INotifyCollectionChanged и INotifyPropertyChanged, и это те интерфейсы, которые WPF ищет в сценарии связывания.Поэтому, если вы используете привязку данных в xaml при определении интерфейса и привязываете к ObservableCommection<Something>, привязка будет автоматически проинформирована при изменении коллекции, и пользовательский интерфейс будет обновлен.Вам не нужно использовать IObservable там.

Не поймите меня неправильно, IObservable - очень полезный и очень мощный шаблон, хотя его немного сложно понять.Лично я очень часто этим пользуюсь.Но это не тот случай, когда вы должны его использовать.

0 голосов
/ 22 января 2012

Если я правильно понимаю, вы хотите две вещи.

1) Узнайте, есть ли какие-либо изменения, внесенные в вашу коллекцию через DataGrid

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

2) Скажите UI, что были внесены некоторые изменения

Я не уверен, где находится эта кнопка сохраненияв пользовательском интерфейсе, но где бы то ни было, вы можете просто связать его свойство enabled с логическим свойством.Как только вы обнаружите изменение в вашем объекте, активируйте кнопку, установив для свойства bool значение true.

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

В этом сценарии нет необходимости использовать IObservable.Вы уже привязаны к ObservableCollection, которого должно быть достаточно.Вам просто нужна простая привязка, чтобы сообщить пользовательскому интерфейсу о включении или отключении кнопки Сохранить

0 голосов
/ 22 января 2012

Интерфейс INotifyPropertyChanged был реализован в .Net Framework для аналогичных задач, как в библиотеке MSDN:

Интерфейс INotifyPropertyChanged используется для уведомления клиентов, обычно привязывающих клиентов, об изменении значения свойства.

...