0

シナリオ: Web サービスからオブジェクトのコレクションを収集し、それらを GUI に表示する必要があります。そのオブジェクトには別のオブジェクト (外部キー) への参照が含まれており、この関連オブジェクトも表す必要があります。

それぞれの欠点を持つ 2 つの可能なオプションを用意しました。

  1. 関連するオブジェクト全体を「ネットワーク経由で」送信します。
  2. 外部キーのみを送信し、別のコレクションを照会する関連オブジェクトを取得します (以前はローカルに保存されていました)

最初のオプションは、データ バインディング (私はクライアント側で WPF を使用しています) を簡単にしますが、通信にかなりのオーバーヘッドが発生します (特に、同じ関連オブジェクトが何度も表示される場合)。したがって、それは進むべき道ではないようです。

2番目のオプションは、はるかに小さなメッセージを実現し、それが進むべき道のようです. ただし、この関連オブジェクトへのデータ バインディングを実行する方法が見つかりません

例を挙げて問題を明確にしましょう。

オブジェクト -> 部屋 || 関連オブジェクト -> 建物 || ローカルに保存されたコレクション -> 建物

Web サービスからのメッセージには、部屋の属性 (「名前」、「サイズ」など) と「BuildingId」が含まれています。「BuildingId」だけでなく、建物からの情報をUIに(データバインディングを介して自動的に)表示できるようにしたいと考えています。したがって、適切な建物オブジェクトを取得するために「Buldings」コレクションを照会し、そのプロパティを使用して UI を設定する必要があるのは当然のことです。

だから、私の質問は次のとおりです。

  1. WPF でデータ バインディングを介してそれを達成するにはどうすればよいですか? それを達成するための自動的な方法があると思います。ありませんか?
  2. 私が見逃している基本的な概念 (データバインディングに関連するもの) はありますか? 私は .NET スタックに慣れていないので、見た目よりも簡単かもしれません!

君たちありがとう!;)

PS:正しい方向に私を向ける可能性のあるドキュメント/リンクは高く評価されます;)

4

2 に答える 2

1

RoomオブジェクトにBuildingというプロパティがあります。これは、最初は空(null)にすることができますが、後でBuildingオブジェクトをロードするときに設定します。ルームオブジェクトはINotifyPropertyChanged、オブジェクトが最終的にロードされたときにUIに通知し、すべてのバインディングを更新するように実装する必要があります。

INotifyPropertyChanged実装のサンプル:

private bool _Active;
public bool Active
{
    get { return _Active; }
    set
    {
        if (_Active == value)
            return;

        _Active = value;
        OnPropertyChanged("Active");
    }
}

#region PropertyChanged Implementation

        // Code Below Copied From : http://www.codeproject.com/KB/cs/PropertyNotifyPart1.aspx
        /// <summary>
        /// Raises the <see cref="E:PropertyChanged"/> event.
        /// </summary>
        /// <param name="propertyName">
        /// Name of the property that changed.
        /// </param>
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            OnPropertyChanged(e);
        }

        /// <summary>
        /// Raises the <see cref="E:PropertyChanged"/> event.
        /// </summary>
        /// <param name="e">
        /// The <see cref="PropertyChangedEventArgs"/> instance
        /// containing the event data.
        /// </param>
        protected void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler temp = this.PropertyChanged;
            if (null != temp)
                temp(this, e);
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler temp = this.PropertyChanged;
            if (null != temp)
                temp(sender, e);
        }

        #endregion
于 2012-12-10T16:48:32.020 に答える
1

2 つのオプションを .Net/WPF の世界の典型的なアプローチに関連付けるには (逆の順序で):

アプローチ 2: Model-View-ViewModel アプローチ (MVVM) が 1 つの方法かもしれません。DTO は、WCF (モデル) を使用してメッセージ パッシングを最適化するように設計されています。MVVM の原則は、データ バインディングなどの懸念事項でそれらを汚染してはならないことを示唆しています。別のクラスである ViewModel がその責任を負い、キャッシュされたルックアップなどを使用してプリミティブ識別子 (BuildingId など) をオブジェクトのバインド可能な表現にマッピングするなどの問題を管理することもできます。DTO にバインドするのではなく、WPF ビューを ViewModel にバインドします。 .

このオプションを追求したい場合は、MVVM の概念を理解してから、支援するツールを検討することをお勧めします。( Caliburn Microは優れていると思いますが、WPF にはいくつかあります)

アプローチ 1: これはより単純なアプローチであり、事前に作成された ViewModel をサーバーからクライアントに提供するように WCF サービスを作成することを意味します (つまり、DTO と ViewModel は同じものです)。既に見てきたように、ViewModel の構築はサーバーで行われるため、冗長なデータの送信に問題が発生する可能性があります。このアプローチは、クライアントとサーバーが非常に緊密に結合されていることも意味します。各 DTO/ViewModel は、特定のビューで使用されるように設計されています。

最終的に、最適なアプローチはアプリケーションの要件によって異なります。冗長なデータ通信を気にせず、できるだけ早くソリューションが必要な単純なアプローチを探している場合は、おそらくアプローチ 1 が適しています。

ただし、他のクライアントにサービスを提供する必要がある場合、または他の理由でクライアントとサーバーの結合を避けることが重要である場合、または効率的な通信が必要な場合は、MVVM アプローチを検討する必要があります。

于 2012-12-10T22:54:20.657 に答える