2012-01-25 28 views
2

MVVMコントロール内のパッケージを表す項目のリストがあります。WPFでツールチップのViewModelを動的に生成するMVVM

ツールチップにカーソルを合わせると、データベースに移動して詳細情報を表示する必要があります。簡単にするために「PackageDetails」と呼ぶだけです。私はViewModelクラスでデータベースの読み込みを処理する方法を知っていますが、インスタンス化するタイミングを把握することができません。

アプローチ1) 'Package'オブジェクトに 'lazy-load'プロパティがあるので、ツールチップがトリガされたときにviewmodelが作成され、すぐにデータベースにアクセスします。 このアプローチは理想的ではありません。それぞれの 'Package'オブジェクトは真のビューモデルではなく、もともとWCFオブジェクトから来たからです。

アプローチ2)このJosh Smith blog entryの説明に従ってコンバータを使用してください。彼の例はコンバータにうまく収まるようですが、実際には私の状況にはうまくいかないと思います。

アプローチ3)何とかXAMLでビューモデルを作成しますが、これは悪い考えです。

MVVM を使用してツールチップのビューモデルを動的に生成するには、どのような方法が適していますか?

答えて

2

ビューへのモデル(パッケージの場合)をバインドすることは、実装する "処理"やビジネスロジックがない非常に単純な状況でのみ機能します。

私はいくつかのオプションを試してみたところ、すべてのモデルのVMラッパーを作成しました。このパスを下ると、ツールチッププロパティが直感的になります。

私が実験したもう1つのオプションは、部分クラスを使用してwcfモデルを拡張することです。これは、検証のためにデータアノテーションを使用しない限り動作します(wcfとdataannotationsは正しく動作しません)

VMでモデルをラップすると、VMラッパーのリストをインスタンス化することはlinqとlambdas

あなたのモデルにパラメータとしてモデルを受け入れるコンストラクタがVM上にあると仮定します。

var listPackageVMs = new ObservableCollection<PackageVM> (listPackageModels.Select(model=> new PackageVM(model))); 
+0

私はいくつかのケースではこのような何かを行っているが、ここで私はかなり深くネストされたオブジェクト持って感謝:オーダー>パッケージ>のOrderItemsなどを、ちょうどツールチップのためにそれを台無しにあまりにも多くを望んでいませんでした –

+0

あなたの2番目の好みは何でしょうか。私は実際にこのインスタンスでは適切だと思われるコンバータを使用しましたが、それでもやや間違って感じます –

+2

WCFが部分クラスとしてすべてのモデルを作成するので、私の2番目の設定は部分クラスです。部分的なクラスに "ToolTip"文字列プロパティを追加し、それをxamlのコントロールのツールチップにバインドすることができます。あなたのツールチップのコンバータが間違っていると私は同意します – Anton

1

パッケージに部分クラスを作成できます。エンティティクラスにデータアクセスロジックを配置することは避けていますが、これは安価で簡単な方法です。

namespace WCFServiceNamespace 
{ 
    // Since WCF generated entities are partial classes, we can inject features 
    public partial class Package 
    { 
     private readonly IDataAccessor _DataAccessor; 

     public Package() 
      : this(DataAccessor.Instance) // how you choose to inject a data accessor is up to you 
     { 
     } 

     public Package(IDataAccessor dataAccessor) 
     { 
      _DataAccessor = dataAccessor; 
      _ToolTip = new Lazy<string>(GetToolTip); 
     } 

     private readonly Lazy<string> _ToolTip; 
     public string ToolTip 
     { 
      get 
      { 
       // executes GetToolTip when the Value property of Lazy<T> is accessed 
       return _ToolTip.Value; 
      } 
     } 

     private string GetToolTip() 
     { 
      // we're assuming we can retreive the tooltip by ID, and that PackageId is defined in the generated WCF entity 
      return _DataAccessor.GetToolTipByPackageId(PackageId); 
     } 
    } 
} 
関連する問題