2009-07-14 58 views
2

我的问题是,你会实现Observer模式,或使用数据绑定执行以下操作:Observer模式或者数据绑定

目前,我初始化GuiDataObj的列表。当一个事件触发时,我查找GuiDataObjById,然后修改该对象,这是绑定到GuiElement的数据;它更新了GUI。

有几个Gui元素(目前都是相同的类型,但这可能会在将来改变),我想能够修改一个类对象,并让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更新桂当通知的变化?

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 

如果我实现了数据绑定,而不是通知观察者发生变化,它会是一个更灵活的设计吗?我想我真正要问的是,什么是最直观地表示业务对象的最灵活的方式,它不断实时更新。

alt text http://devpupil.net/GuiConcept.PNG

回答

3

我会用一个观察者。当它们所代表的底层模型/数据发生变化时,自动更新其值的GUI是使用Observer模式的经典示例之一。

1

当我开发我们的项目时,我们想出了Observer和EventListener模式。我相信这些模式与发布/订阅模式是相同的概念。我们确实选择了EventListener(EventObject)方法来实现对象之间的松散耦合,并为事件提供更多的可扩展性。

EventListener的好处是我们可以根据事件需求向EventListener添加更合理的事件函数(?)。请纠正我,如果它走错了方向。

我希望它有帮助。

老虎。