2009-04-06 13 views
4

XAMLのUIオブジェクトに表示されるデータ型のバインディングと変換に関する質問があります。WPFデータバインディングと型変換

異なるアプリケーションで再利用したいユーザーコントロールがあります。ユーザーコントロールは、名前や住所などの人口統計情報を表示するためのサムネイル画像と複数のTextBlockを表示します。ユーザーコントロールはMVVMデザインで使用されるため、ユーザーコントロール固有のViewModelにバインドされています。

一般的なMVVMの設計原則に従えば、ユーザーコントロール用のViewModelは、多くの場合、他のViewModelに埋め込まれ、より大きなUIを構成します。

ユーザーコントロールビューモデルでは、特定の型(クラス)がバインディングオブジェクトとして想定されています。 しかし、埋め込まれたUCのVMが全く異なるオブジェクトモデルを持つViewModelは、UCのVMにデータを単にパススルーすることはできません。親VMのデータモデルからUC VMのデータモデルへの変換が必要です。

私の質問は次のとおりです。この変換を実行するための認可された方法はありますか?

私はIValueConverterとIMultiValueConverterを見ましたが、これはやり方のようには見えません。

私は、親VMと埋め込みUC VMの間のシムのようなものが必要だと思います。親VMのデータがUC VMに必要なフォーマットに変換されます。

または、基本的には、親VMが提供するすべてのタイプを処理するカスタムUC VMを作成する必要がありますか?

+0

ユーザーコントロールビューモデルという用語を使用するとどういう意味ですか?問題のユーザーコントロールで使用されているビューモデル –

答えて

1

親VMが子VMのスーパーセットである場合、通常、親VMは子VMへの参照を保持します。その参照をプロパティとして公開し、ContentControl(または何でも)をそのプロパティにバインドします。

これで問題は解決しないでしょうか?

+0

親VMがUC VMのネイティブ形式のデータを提供する場合、問題なく動作します。つまり、親VMは子VMのスーパーセットですが、データはまったく異なる形式です。私はこの物には新しいので、あなたは私の無知を許す必要があります。 – MattJ

0

タイプ変換を実際に行いたい場合は、値コンバーターを正確に使用してください。つまり、IValueConverterのようなものによって処理されるコンバージョンのタイプは、比較的シンプルで直接的です。

しかし、あなたのトップレベル/親/管理ユーザコントロールが、実際のコンテンツをホストするユーザコントロールのより大きなタイプのビットと部分を解析する必要がある場合、それがそのトップレベルコントロールの仕事です。このすべてをXAMLで行うにあたって、すべての問題を解決する必要はありません。必要なものを解析し、これらの子コントロールのプロパティを直接設定することは、まったく問題ありません。

2

私はケンに同意する、彼は答えがあると思う。共通のユーザーコントロールに渡すデータの構成が多数ある場合は、そのデータ構成の所有者がユーザーコントロールにバインドする共通のフォームに変換する必要があります。

共通のフォーマットでプロパティを公開し、対応するビューモデルを持っているでしょうコントロールを使用する各ビュー:

public class SampleViewModel { 
    ... 

    IUserControlData ControlData 
    { 
     get 
     { 
      // Do conversion here or do it early and cache it. 
     } 
    } 

    ... 
} 

が次にビューにユーザーコントロールにそのプロパティを結合する

<common:CommonUserControl DataContext={Binding Path=ControlData} ... > 
関連する問題