Мой вопрос в том, реализуете ли вы шаблон Observer или используете привязку данных для выполнения следующих действий:
На данный момент я инициализирую список GuiDataObj. Когда событие запускается, я просматриваю GuiDataObjById, а затем модифицирую объект, который привязан к GuiElement; который обновляет графический интерфейс.
Есть несколько GuiElements (на данный момент все одного типа, но это может измениться в будущем), я хочу иметь возможность модифицировать объект класса, и GuiElement автоматически обновляет GuiElement с помощью отраженное изменение.
public class GuiElement : ObservableImpl
{
private string guiElementName;
public String GuiElementName
{
get { return guiElementName; }
set
{
guiElementName = value;
NotifyObservers(guiElementName);
}
}
private string status;
public String Status
{
get { return status; }
set
{
status = value;
NotifyObservers(status);
}
}
}
public interface IObserver
{
void Notify<T>(T watchObj);
}
public interface IObservable
{
void Register(IObserver observer);
void UnRegister(IObserver observer);
}
public class ObservableImpl : IObservable
{
protected Hashtable _observerContainer = new Hashtable();
public void Register(IObserver anObserver)
{
_observerContainer.Add(anObserver, anObserver);
}
public void UnRegister(IObserver anObserver)
{
_observerContainer.Remove(anObserver);
}
public void NotifyObservers<T>(T anObject)
{
foreach (IObserver anObserver in _observerContainer.Keys)
anObserver.Notify(anObject);
}
}
А затем обновите GuiElement Gui, когда вас уведомят об изменении?
public partial class GuiElementControl : UserControl, IObserver
{
public GuiElementControl()
{
InitializeComponent();
}
#region Implementation of IObserver
public void Notify<T>(T watchObj)
{
if (watchObj is GuiElement)
{
UpdateGui(watchObj);
}
}
private static void UpdateGui(object obj)
{
GuiElement element = obj as GuiElement;
if (element != null)
{
NameLbl.Text = element.GuiElementName;
StatusLbl.Text = element.Status;
}
}
#endregion
было бы более гибким, если бы я применил привязку данных, вместо того, чтобы уведомлять наблюдателя об изменениях? Я предполагаю, что я действительно спрашиваю, самый гибкий способ визуального представления бизнес-объекта, который постоянно обновляется в режиме реального времени.
Я бы использовал Observer. GUI, которые автоматически обновляют свои значения, когда базовая модель/данные, которые они представляют, являются одним из классических примеров использования шаблона Observer.
Когда я разработал наш проект, мы придумали Observer и шаблоны EventListener, как вы это делали. Я считаю, что эти шаблоны - это та же концепция, что и шаблон публикации/подписки. Мы выбрали способ EventListener (EventObject) для создания взаимосвязи между объектами и для большей расширяемости функций для событий.
Преимущество EventListener заключается в том, что мы можем добавить более разумные функции событий (?) в EventListener на основе наших требований к событиям. Пожалуйста, исправьте меня, если он идет в неправильном направлении.
Надеюсь, это поможет.
Tiger.