Нужно ли использовать IObservable для отслеживания изменений в моей коллекции?

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

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

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, я видел примеры, когда продукт предоставляет события, на которые можно подписаться. Однако я не хочу подключать обработчики событий ко всем своим объектам. Мне нужно что-то, что говорит мне в целом, когда какой-либо объект в коллекции изменился.

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


person Remotec    schedule 22.01.2012    source источник


Ответы (3)


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

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

person Falanwe    schedule 22.01.2012
comment
Ура - не могли бы вы привести пример привязки, которая будет работать в моем сценарии? - person Remotec; 22.01.2012
comment
В обзоре привязки данных в MSDN есть много примеров: msdn. microsoft.com/en-us/library/ - person Falanwe; 22.01.2012
comment
Привет, да, но что я могу привязать к и от? Моя сетка, моя коллекция? Моя кнопка, которую я хочу активировать, когда коллекция продуктов загрязнена, — это просто кнопка панели инструментов в моем файле MainWindow.xaml. - person Remotec; 22.01.2012

В среде .Net для аналогичные задачи, согласно библиотеке MSDN:

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

person Lloyd    schedule 22.01.2012
comment
Мне кажется, это правильный подход. Я думаю, что сетка данных может автоматически использовать этот интерфейс, но как мне заставить мой пользовательский интерфейс определять, когда что-то изменилось? - person Remotec; 22.01.2012
comment
Я не на своем компьютере, но вот ссылка из MSDN, которую я ранее добавил в закладки. msdn.microsoft.com/en-us/library/ms743695.aspx - person Lloyd; 22.01.2012

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

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

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

2) Сообщите пользовательскому интерфейсу, что были внесены некоторые изменения

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

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

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

person Haris Hasan    schedule 22.01.2012
comment
Хорошо, спасибо за информацию. Есть ли что-то в моей коллекции, к чему я могу привязать? - person Remotec; 22.01.2012
comment
я не знаю, где твоя кнопка - person Haris Hasan; 22.01.2012
comment
Это просто на панели инструментов моего MainWindow.xaml. Это главное окно также содержит сетку данных. - person Remotec; 22.01.2012
comment
затем просто создайте логическое свойство и привяжите к нему свойство с включенной кнопкой. Нет необходимости добавлять это в коллекцию. Вам понадобится INotifyPropertyChanged, чтобы уведомить, что что-то изменилось - person Haris Hasan; 22.01.2012
comment
Привет, где я должен реализовать это логическое свойство, давайте назовем его ProductsChanged. Не могли бы вы привести простой пример, поскольку я, похоже, не понимаю, куда поместить это свойство. Еще раз спасибо. - person Remotec; 24.01.2012