Прочитал немного об 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, я видел примеры, когда продукт предоставляет события, на которые можно подписаться. Однако я не хочу подключать обработчики событий ко всем своим объектам. Мне нужно что-то, что говорит мне в целом, когда какой-либо объект в коллекции изменился.
Кроме того, как мне подключить это уведомление к своему пользовательскому интерфейсу.
Ответ 1 · рейтинг 3 · Falanwe
ObservableCollection<Something>, несмотря на свое название, не имеет ничего общего с IOberservable<Something>. Он реализует INotifyCollectionChanged и INotifyPropertyChanged, и это интерфейсы, которые WPF ищет в сценарии привязки. Поэтому, если вы используете привязку данных в своем xaml при определении интерфейса и привязываетесь к ObservableCommection<Something>, привязка будет автоматически информироваться об изменении коллекции, и пользовательский интерфейс будет обновлен. Вам не нужно использовать IObservable там.
Не поймите меня неправильно, IObservable - очень полезный и очень мощный шаблон, хотя и немного сложный для понимания. Лично я использую его много. Но это не тот случай, когда вы должны его использовать.
Ответ 3 · Haris Hasan
Если я правильно понимаю, вы хотите две вещи.
1) Узнайте, были ли внесены какие-либо изменения в вашу коллекцию через DataGrid.
Ваш сеттер уже вызывается через привязки, поэтому вы можете легко это отследить.
2) Сообщите пользовательскому интерфейсу, что были внесены некоторые изменения
Я не уверен, где эта кнопка сохранения находится в пользовательском интерфейсе, но где бы вы ни находились, вы можете просто связать ее свойство enable с логическим свойством. Как только вы обнаружите изменение в своем объекте, включите кнопку, установив для свойства bool значение true.
Я думаю, что я мог бы использовать IObservable для достижения моей второй цели информирования пользовательского интерфейса о том, что строка была изменена?
В этом сценарии нет необходимости использовать IObservable. Вы уже привязываетесь к ObservableCollection, этого должно быть достаточно. Вам просто нужна простая привязка, чтобы сообщить пользовательскому интерфейсу о включении или отключении кнопки "Сохранить".