WPF MVVMエクスプローラのようなアプリケーションでは、現在の選択に依存してメニューアイテムを実装する方法

StackOverflow https://stackoverflow.com/questions/2525759

  •  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を言及します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top