私は比較的WPFに不慣れで、解決策を見つけることができないような問題に出くわしました。
私はそのような問題に関するスレッドがすでにあると確信していますが、私の不足している知識に関しては、私はそれを見つけられなかったか、単にそれを理解しなかった可能性が非常に高いです。
私の問題:
私はC#でWPFアプリケーションを開発しています。それは巨大なViewModelとXAMLを持つ大きなMainWindowを持つOutlookスタイルのアプリケーションです。 私がやろうとしていたのは、単一のコードファイルを少し分割して、もう少しモジュール化してコンパクトにすることです。 私はTelerik Controlsを使用していて、単一のSplitContainerのコンテンツをPagesにアウトソーシングしようとしました。
今日、どういうわけかばかげていて複雑すぎないような新しい状況が起こりましたが、どういうわけか私はそれを機能させることができません。
状況:
私は自分の "MainWindow"にTreeviewを持っていて、そこで選択を変更したときはいつでも、自分がバインディングしている自分のPageのプロパティを変更したいのです。
そのため、 "TreeView_3"の項目をクリックしたときに、 "Page_X"のDataContextにEventHandler(SelectionChanged_TreeView3)を介してプロパティを設定します。
私がメインウィンドウでこれをしなければならなかったら、私は通常そのようにするでしょう:
UserViewModel uvm = mainGrid.DataContext as UserViewModel;
それから私がアクセスしたい特定のUserViewModel(MainWindowのViewModel)のどんなプロパティでも呼び出すだけです。
これはイベントハンドラが呼び出される場所なので、 "mainGrid.DataContext"は常にMainWindowを参照するので、明らかに同じことをページに対しても同じことはできません。
だから私が必要とするのは、異なるViewModelを持つページからDataContextにアクセスする方法について少し説明することです。
説明するためにコードが必要な場合は、教えてください。
例を見ないで言うのは難しいです。しかし、それはあなたがViewModelsにINotifyPropertyChangedを実装する必要があるということかもしれません?
OnPropertyChanged( "PropertyName")を呼び出す。 viewmodelプロパティのセッターでは、UIが変更を反映します。
また、両方のビューが同じオブジェクトを参照しており、同じオブジェクトのコピーを参照していないことを確認してください。
例を見ないで言うのは難しいです。しかし、それはあなたがViewModelsにINotifyPropertyChangedを実装する必要があるということかもしれません?
OnPropertyChanged( "PropertyName")を呼び出す。 viewmodelプロパティのセッターでは、UIが変更を反映します。
また、両方のビューが同じオブジェクトを参照しており、同じオブジェクトのコピーを参照していないことを確認してください。
あなたはあなたの懸念を切り離す必要があります。背後にあるコードには、表示関連のものを処理するコードしかないはずです。ほとんどの場合、私の後ろにあるコードは空です。
あなたのViewModelでは、あなたのデータ関連ロジックを扱うべきです。そのため、背後のコードにデータコンテキストをキャストするのではなく、ビューモデルの Command
でクリックを処理します。
TreeView
の SelectedItemChanged
にコマンドをバインドすることはできませんので、インタラクショントリガを使うことができます。
あなたはあなたの懸念を切り離す必要があります。背後にあるコードには、表示関連のものを処理するコードしかないはずです。ほとんどの場合、私の後ろにあるコードは空です。
あなたのViewModelでは、あなたのデータ関連ロジックを扱うべきです。そのため、背後のコードにデータコンテキストをキャストするのではなく、ビューモデルの Command
でクリックを処理します。
TreeView
の SelectedItemChanged
にコマンドをバインドすることはできませんので、インタラクショントリガを使うことができます。