Автоматическое обновление пользовательского интерфейса при изменении бизнес-объектов - PullRequest
3 голосов
/ 10 октября 2008

Это больше вопрос дизайна.

Я создаю инструмент, который отображает бизнес-объекты различными способами (например, узлы дерева, элементы представления списка, поля со списком, текстовые поля и т. Д.). Каждый раз, когда пользователь меняет любой из них, возникает событие, которое сигнализирует, что этот бизнес-объект был изменен или коллекция, к которой он принадлежит, была изменена. Поскольку этот бизнес-объект или коллекция, к которой он может принадлежать, может отображаться в нескольких местах, каждый из этих элементов пользовательского интерфейса необходимо обновить, чтобы отразить это изменение. Существует ли элегантное решение для правильного обновления каждого типа элемента пользовательского интерфейса в случае изменения?

У меня есть несколько идей о том, как это можно сделать, но я хотел бы посмотреть, была ли у кого-нибудь эта проблема и довольны ли ее решением. Это C # WinForm, но решение может быть на любом языке.

Мои текущие мысли о проблеме и возможном решении:

Это становится более сложным, когда вы хотите очистить привязки событий (т.е. businessObject.Changed - = ObjectChanged), когда ваши бизнес-объекты становятся частью TreeNodeCollection / ListViewITemCollection / ComboBoxItemCollection и вызывается Clear ().

Как насчет «Сервиса», где каждый объект и его элемент пользовательского интерфейса могут регистрироваться, где события бизнес-объекта могут прослушиваться в одном месте, и каждый элемент пользовательского интерфейса будет обновляться при возникновении событий? Когда все элементы пользовательского интерфейса отменили свою регистрацию, подписка на событие этого объекта удаляется.

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

Ваши мысли?

Ответы [ 4 ]

3 голосов
/ 10 октября 2008

Вы можете попробовать шаблон наблюдателя. http://en.wikipedia.org/wiki/Observer_pattern

2 голосов
/ 10 октября 2008

Используйте систему обмена сообщениями. Создайте делегата следующим образом:

public delegate void ObjectRefresh(BusinessObject obj);

Затем в вашем классе BusinessObject:

public event ObjectRefresh;

А при изменении свойства:

if (ObjectRefresh)
    ObjectRefresh(this);

И на всех ваших пользователях:

BusinessObject obj = GetBusinessObject();
obj.ObjectRefresh += this.ObjectRefresh;
...
private void ObjectRefresh(BusinessObject obj)
{
    // update UI
}

:)

0 голосов
/ 10 октября 2008

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

если нет, то вам нужен шаблон Observer, как упомянуто выше

0 голосов
/ 10 октября 2008

Взгляните на Bindable Linq ... решение этой проблемы Пола Стовелла.

http://www.codeplex.com/bindablelinq

Если это не поможет решить вашу проблему, это поможет вам написать это самостоятельно.

Прочитайте также его блог.

http://www.paulstovell.com/blog/

...