WPF MVVMエクスプローラのようなアプリケーションでは、現在の選択に依存してメニューアイテムを実装する方法
-
22-09-2019 - |
質問
私は、WPFとMVVMに新しいです、と私は両方を利用するアプリケーションに取り組んでいます。アプリケーションは、そのメニュー(ShellViewModel)と、メインウィンドウとアプリ、ツリーコントロール(TreeViewModel)、およびリストコントロール(ListViewModel)を検討し、Windowsエクスプローラに似ています。 (ツリーやリストであってもよい)、現在選択されている項目を削除し、削除>、
- 。私はそのような編集などのメニュー項目を実装します私はジョシュ・スミスのRelayCommandを使用して、そしてShellViewModelにDeleteItemCommandにメニューアイテムを結合するのは簡単ですしています。それはDeleteItemCommandを実装するように思える、しかし、フォーカス/選択を追跡し、実施のための適切な子への行動を指示するためにShellViewModelと2つのつの子ビューモデル(TreeViewModelとListViewModel)の間にいくつかのかなり密結合が必要です。それは私には間違っているようだ、と私は何かが欠けていると思うなります。
簿記を行うにはフォーカスマネージャおよび/または選択マネージャを書くのはあまりにもハードいないようだ、と一緒にクラスを結合せずに行うことができます。ウインドウシステムは、すでにビューがフォーカスを持っているのを追跡している、と私は、コードを複製することがしたいように思えるます。
私はありませんかわからについてListViewModelまたはTreeViewModelのいずれかまでのルートShellViewModelからコマンドをだろう、私はコードの混乱せずに実際の作業を行う方法です。いつの日か、アプリケーションは、より多くの2人の子供よりも含むように拡張され、私はシェルができるだけ痛みのないように、その拡張を行うことが可能と子供の無知のようにしたい。
いくつかのサンプルWPF / MVVMアプリケーションを見てみると(カールShifflettの暗号文、ジョシュ・スミスさんMVVMデモの、など)、)私はこれを行う任意のコードを見ていない(または私はそれを理解していなかった。
にかかわらず、あなたは私のアプローチは、ベースオフの方法であるか、私はほんの少しニュアンスが欠けていると思うかどうかの、自分の考えと私は再び軌道に乗るヘルプを共有してください。ありがとう!
解決
MVVMのジョシュ・スミスの実装にいくつかの固有の問題があります。件名にウォードベルのポストを見てみましょう:のhttp:/ /neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.htmlする。あなたはこの結合をViewModelに最初のアプローチを取ると破るなどカリバーンなどいくつかの代替MVVMフレームワークを見てみたいことがあります。
他のヒント
RelayCommandはあなたのビューにバインドすることができ、あなたのViewModelでコマンドを取得するだけの方法です。
私は別のMVVMアーキテクチャのバリエーションやサンプルアプリケーションのすべてからステップバックに傾いて、そしてちょうど良い古いOODを使用することだと思います。なぜTreeViewVmとListViewVmのためのいくつかの並べ替え(すなわち、DetailsViewModelBase)のViewModelに基本クラスを持っていません。サブクラス共有として多くの実装(または抽象の場合なし)として持つCanDeleteと削除の方法とそこでのDeleteCommandの、とのSelectedItemを入れにも。その後、バインド以下のXAMLに似たコントロールへのSelectedItemます:
<ListView AlternationCount="2" MinHeight="250" MaxHeight="400"
ItemsSource="{Binding Projects.View}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedProject, Mode=TwoWay}"
behaviors:SelectionBehavior.DoubleClickCommand="{Binding PickCommand}"
ItemContainerStyle="{StaticResource listingRowStyle}"
>
キーバインディングはのSelectedItemとIsSynchronizedWithCurrentItemされます。
HTH、
Berryl
私はケントBoogaartでブログ記事を発見しました彼はActiveAwareCommandを呼び出しについて説明します。私はまだそれを試していないが、これは、私が探していたものをやっているようです。投稿にコメントが同様の挙動を有するようプリズムのIActiveAwareを言及します。