2009-07-14 15 views
2

私の質問です、あなたはObserverパターンを実装するか、次の操作を実行するためにデータバインディングを使用し、データバインディング:現時点では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

答えて

3

私はオブザーバーを使用すると思います。基礎となるモデル/データが変更を表すときにその値を自動更新するGUIは、Observerパターンを使用する古典的な例の1つです。

1

私がプロジェクトを開発したとき、私たちはObserverとEventListenerパターンを思いついた。私は、これらのパターンはパブリッシュ/サブスクライブパターンと同じ概念だと考えています。私たちは、オブジェクト間の疎結合を作成し、イベントの関数の拡張性を高めるためにEventListener(EventObject)を選択しました。

EventListenerの利点は、イベント要件に基づいて、より合理的なイベント関数(?)をEventListenerに追加できることです。間違った方向になったら、私を修正してください。

私はそれが役に立ちそうです。

Tiger。

関連する問題