Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: RemotecОтветов: 3

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

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

  • Вы смотрели INotifyPropertyChanged? msdn.microsoft.com/en-us/library/ Lloyd 22.01.2012

wpfwpfdatagrid

Ответы

Ответ 1 · рейтинг 3 · Falanwe

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

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

Ответ 2 · Lloyd

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

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

Ответ 3 · Haris Hasan

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

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы