2012-01-26 14 views
2

私は自分のビューのDataContextされている任意のオブジェクトを許可する気分になりません。 MVVMのパターンに従っているので、すべてのウィンドウに独自のVMがあります。私は何をすることを計画するには、次の(窓から撮影と呼ばれるオプション)です。DataContextをWindowのViewModelに限定して間違っていますか?

internal new OptionsVM DataContext 
    { 
     get 
     { 
      return (OptionsVM) base.DataContext; 
     } 
     set 
     { 
      if (this.DataContext != value) 
      { 
       base.DataContext = value; 
      } 
     } 
    } 

私は何かが欠けていた場合、あなたが参照するか、これが原因何かに悪い考えであることができた場合、私は認識していないよいます?

ありがとうございます。

答えて

2

一般に、インターフェイス要素を非表示にすると、奇妙なバグが発生する可能性があります。たとえば、次のコードは、InvalidCastExceptionを生成します。

OptionsView view = new OptionsView(); 
Window window = view; 
window.DataContext = new DifferentVM(); 
OptionsVM = view.DataContext; 

それは、やや不自然な例ですが、あなたは、オブジェクトのDataContextのを設定するには、WPFのバインディングを使用する場合、同様のシナリオは非常に可能性があります。

DataContextプロパティが設計通りに存在するようにし、その代わりに、より強く型付けされた方法でデータコンテキストを受け入れるコンストラクタをMy Viewsに与えてください。ビューのコードでは、私はまた、適切なタイプのViewModelにプロパティを持っている:

public OptionsView(OptionsVM viewModel) 
{ 
    DataContext = viewModel; 
} 

private OptionsVM ViewModel { get { return DataContext as OptionsVM; } } 
+0

私はコンストラクタのアプローチが好きですが、私はViewプロパティに同意しません。ファイルの背後にあるコードの方がコードを良くすることが少なくなるようにしようとすると、逆効果があります。 –

+0

ctorの実行後に他の人が 'DataContext'のデータ型を変更しないようにするにはどうすればよいですか? – SliverNinja

+1

あなたはそうではありません。 WPFのバインディングシステムは実際に強く型付けされることを望んでおらず、それと戦う意味もありません。 ctorとプロパティは、実際には人間の利益のために栄光のドキュメントです。 –

2

私が見ることができる唯一の問題は、あなたが構造

Window view = new OptionsView(); 

view.DataContext = ....; 

を使用した場合、その後のDataContextはまだ型オブジェクトのものであろう - それは、常にあなたを見るためにビューのタイプの参照を使用する必要があります強いタイピング

+0

私は今まで、私は一般的なアプローチを使用する必要がなかったとにかく同意するけど...いくつかの場所で私が計画ので、それは少し醜いです誰かがあなたのアプローチを使用する場合に呼び出されないプロパティにいくつかのコードを追加する... –

+0

理想的には、XAMLバインディングで 'DataContext'をタッチするだけです - コードビハインドでコンテキストを操作する必要性を避けるべきです。しかし、良い点。 +1 – SliverNinja

1

あなたのアプローチは危険を伴わないはずです。このようにして実装した理由についてコメントしてください。私はベースのObjectクラスよりも強力なデータ型のためです。私はこれが実際にサポートされているコンテキストが何であるかを明確にしていると思います。

@SeanUで提案されているコンストラクタのアプローチを使用しても、他の人が作成後にDataContextタイプを変更することはできません。

+0

私はbase.DataContextを呼び出しているので、あなたの言うことは真実ではないと思います。 –

+0

MVVMのメリットは何ですか?あなたのXAMLバインディングでは、あなたの型はとにかく無関心です。型が何であるかは関係ありません。あなたがコードの背後にある 'DataContext'を操作する必要があるなら、それは良い兆候ではありません。私は 'DataContext'で扱うことができるオブジェクトのタイプを制限する方法を探しているだけでしょう - 多分それを操作しないかもしれません。 – SliverNinja

+1

間違いを避けるために、できる限りハードタイプのものをすべて用意してください。 –

関連する問題