2

これは設計上の問題です。

ビジネス オブジェクトをさまざまな方法で表示するツールを構築しています (つまり、ツリー ノード、リスト ビュー アイテム、コンボ ボックス、テキスト フィールドなど)。ユーザーがそれらのいずれかを変更するたびに、そのビジネス オブジェクトが変更されたか、それが属するコレクションが変更されたことを通知するイベントが発生します。このビジネス オブジェクト、またはそれが属する可能性のあるコレクションは、複数の場所に表示される可能性があるため、これらの UI 要素のそれぞれを更新して、この変更を反映する必要があります。変更が発生した場合に各タイプの UI 要素を正しく更新するエレガントなソリューションはありますか?

これを行う方法についていくつかのアイデアがありますが、誰かがこの問題を抱えていて、解決策に満足しているかどうかを確認したいと思います. これは C# の WinForm ですが、ソリューションはどの言語でもかまいません。

問題と可能な解決策に関する私の現在の考え:

ビジネス オブジェクトが TreeNodeCollection/ListViewITemCollection/ComboBoxItemCollection の一部になり、コレクションで Clear() が呼び出されたときに、イベント バインディングをクリーンアップする場合 (つまり、businessObject.Changed -= ObjectChanged) はさらに複雑になります。

「サービス」では、各オブジェクトとその UI 要素を登録でき、ビジネス オブジェクトのイベントを 1 か所でリッスンでき、イベントが発生すると各 UI 要素が更新されます。すべての UI 要素が登録解除されると、そのオブジェクトのイベントへのサブスクリプションが削除されます。

このソリューションの問題点は、すべてのコントロールが作成ごとに UI コンポーネントとオブジェクトを登録する必要があることです。これは面倒です。

あなたの考え?

4

4 に答える 4

3

オブザーバー パターンを試してみてください。http://en.wikipedia.org/wiki/Observer_pattern

于 2008-10-10T03:02:29.780 に答える
2

メッセージング システムを使用します。次のようなデリゲートを作成します。

public delegate void ObjectRefresh(BusinessObject obj);

次に、BusinessObject クラスで次のようにします。

public event ObjectRefresh;

プロパティが変更されると、次のようになります。

if (ObjectRefresh)
    ObjectRefresh(this);

そして、あなたのすべてのUIで:

BusinessObject obj = GetBusinessObject();
obj.ObjectRefresh += this.ObjectRefresh;
...
private void ObjectRefresh(BusinessObject obj)
{
    // update UI
}

:)

于 2008-10-10T02:58:39.320 に答える
0

BindableLinqをご覧ください...PaulStovellによるこの問題の解決策。

http://www.codeplex.com/bindablelinq

それがあなたの問題の解決策を提供しない場合、それはあなたにこれを自分で書くためのいくつかのインサイトを与えるでしょう。

彼のブログも読んでください。

http://www.paulstovell.com/blog/

于 2008-10-10T03:13:51.520 に答える
0

これが本当に必要なこと、つまり、まだ発生していないことを確認してください。たとえば、GUIオブジェクトがデータセットにバインドされていて、ビジネスオブジェクトが変更をデータセットにマージする場合、データセットはデータが変更されたことをGUIオブジェクトに自動的に通知します。データベースのGUIオブジェクトは自動的に更新されます

そうでない場合は、上記のオブザーバーパターンが必要です

于 2008-10-10T03:43:41.837 に答える