观察者模式或数据绑定

时间:2009-07-14 15:09:09

标签: c# data-binding user-interface observer-pattern

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

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

有几个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
如果我实现数据绑定,而不是通知观察者更改,那么它会是一个更灵活的设计吗?我想我真正要问的是,什么是可视化表示业务对象的最灵活方式,它实时更新。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

我希望它有所帮助。

虎。