gpt4 book ai didi

c# - 观察者模式或数据绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 21:24:35 25 4
gpt4 key购买 nike

我的问题是,您会实现观察者模式,还是使用数据绑定(bind)来执行以下操作:

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

有几个 GuiElement(目前都是同一类型,但将来可能会改变),我希望能够修改类对象,并让 GuiElement 自动神奇地更新 GuiElement反射(reflect)的变化。

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

如果我实现数据绑定(bind),而不是将更改通知观察者,是否会是一个更灵活的设计?我想我真正想问的是,什么是最灵活的可视化表示业务对象的方式,它不断实时更新。

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

最佳答案

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

关于c# - 观察者模式或数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1126035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com