2012-04-25 5 views
0

私は自分のWPFアプリケーションに関連するMainViewModelを持ち、そのコンストラクタを介して割り当てられたMainViewを持っています。個々のビューモデルをネストされたビューに割り当てるか?

アプリケーション> URI> MainWindow.xaml

public MainWindow() 
    { 
     InitializeComponent(); 

     var viewModel = new MainViewModel(); 

     DataContext = viewModel; 
    } 

を起動マイMAINVIEWが隠されているとされているボタンに基づいて表示されているように最大4つのネストされたビューまたは子ビューを保持していますMainViewをクリックします。したがって、Visibilityプロパティを切り替えるには、MainViewの各ボタンに割り当てられたコマンドバインディングによって更新されるバインディングを切り替えます。

各ネストされたビューには、関連付けられたViewModelがありません。子ビューにあるすべてのバインディングは、MainViewModelでその情報を検索します。だから、バインディングシステムは、親の 'MainView'に関連付けられたViewModelがあることを知るために、アプリケーションのUIツリーを使い果たします。

全体的に 'ONE' - > ViewModelがあります。これはうまくいくと思われますが、期待通りにこのVMは大きくなり、再要因を必要とします。それは文脈上でははならない情報を保持しています。しかし、これは証明概念のアプリケーションです。だから私はそれを簡単に保ち、それができるかどうかを確認することにしました。

問題:私は出力ウィンドウに、期待される奇妙な、壊れた行動などの結合誤りに気づいた空のビューモデルと空のビューを割り当てる試み

。どの意味がありません... WPFにネストされたビューコントロールで見つかったバインディングをどのように処理するかを、より明確かつ簡潔に知らせる方法はありますか?上記のように、各ビューのコンストラクタが対応するVMに割り当てられていれば、論理的に意味をなさないように動作するはずです。残念ながら、メインビュー上のすべてのボタンは、対応するビューがオンに切り替えられ、他のボタンが非表示になるように指定されているときに動作を停止します。関連するViewModelがあります。いくつかのボタンでは動作し、他のボタンでは動作しません。これは本当に奇妙ですか?

答えて

0

上記の私の答えで述べたように、WPFバインディングシステムは実行時にバインディングを解決するために苦労していました。メインビューには、関連付けられたビューモデルがインスタンス化され、メインビューコンストラクタを介して割り当てられます。このパターンは、MainViewにも含まれるすべてのネストされたビューに対して繰り返されます。

デフォルトでは、暗黙的なバインディング構文を使用する傾向があります。つまり、明示的にソースを指定することなく、バインディングシステムはバインドで指定した名前を解決しようとします。だからそれはすべて暗黙のうちに明示的に何も設定されていません!

それぞれのネストされたビューを独自のビューモデルにアップグレードすることで、この自動検出/バインディングの解決が少し狂ってしまい、バインディングシステムに、私が探しているプロパティを見つける場所を明示していません。

これは、出力ウィンドウがネストされたビュー - > viewmodelsのバインディング式を解決しようとしていることを伝えているため、予期しない動作につながります。実際にVMがそれを探しているときは、空ではありません!

バインディング構文内で明示的にソースプロパティを設定しないと、バインディングシステムは良好です。それは自分で物事を見つけるのに十分なほど賢いです。私の場合、何かを見つける場所が不明なので、何か特別な助けが必要でした。

SOLUTION:

  1. がMAINVIEWコンストラクタでMainViewModelのコンストラクタの宣言を削除します。
  2. のviewmodelsのxmlnsでスコープ
  3. がリソースにキーを与えるの.xaml MAINVIEW内部のウィンドウリソースを作成します
  4. あなたMainView.xamlにな名前空間。
  5. MainView xamlファイルのすべてのバインディングを、sourceプロパティをインクルードするようにアップグレードします。
  6. 手順4で設定したViewModelキー値を指す静的リソースバインディングをソースプロパティに指定します。
  7. MainViewに関連付けられているViewModelを参照するバインディングに対してのみ手順6を実行します。
  8. すべてのネストされたビューは単独で残されているため、独自のxamlファイルで独自のbindingdsを処理する必要があります。 MainViewはインスタンス化してUIに配置します。私の場合、これが当てはまりました。私は入れ子にされた意見について、それ以上バインディングを持っていませんでした。 MainView.xamlファイルにあるすべてのBindingsは、MainViewModel.csのデータを参照していました。これは、問題を見るときに、より簡単になります。

何らかの理由でエディタが扱いにくかったため、サンプルコードを省略することを選択しましたが、上記の手順は、私が取った手順に従うのに十分説明的です。上記は私のために働いたものです。

  • ほとんどの本が複数のデータコンテキストが利用可能な場合はどうなり
  • 短い結合構文を教える?この問題を合算する別の方法
  • バインディングシステムは、短手のバインディング式の解決方法をどのように知っていますか。
関連する問題