1

私は WPF と MVVM が初めてで、両方を利用するアプリケーションに取り組んでいます。このアプリケーションは Windows エクスプローラーに似ているため、メニュー付きのメイン ウィンドウ (ShellViewModel)、ツリー コントロール (TreeViewModel)、およびリスト コントロール (ListViewModel) を備えたアプリを検討してください。Edit -> Delete などのメニュー項目を実装したいと考えています。これは、現在選択されている項目 (ツリーまたはリスト内にある可能性があります) を削除します。

Josh Smith の RelayCommand を使用しており、ShellViewModel で menuitem を DeleteItemCommand にバインドするのは簡単です。ただし、DeleteItemCommand を実装するには、ShellViewModel と 2 つの子ビュー モデル (TreeViewModel と ListViewModel) との間のかなり緊密な結合が必要であり、フォーカス/選択を追跡し、アクションを適切な子に向けて実装する必要があります。それは私には間違っているようで、何かが足りないと思います。

ブックキーピングを行うためのフォーカス マネージャーやセレクション マネージャーを作成することはそれほど難しくないように思われ、クラスを結合しなくても実行できます。ウィンドウ システムは、どのビューにフォーカスがあるかを既に追跡しており、コードを複製しているように見えます。

私がよくわからないのは、コマンドを ShellViewModel から ListViewModel または TreeViewModel のいずれかにルーティングして、コードを混乱させることなく実際の作業を行う方法です。いつの日か、アプリケーションは 2 つ以上の子を含むように拡張される予定です。その拡張をできる限り無痛にするために、シェルが子をできる限り無視するようにしたいと考えています。

いくつかのサンプル WPF/MVVM アプリケーション (Karl Shifflett の CipherText、Josh Smith の MVVM Demoなど) を見ても、これを行うコードは見たことがありません (または理解できませんでした)。

私のアプローチが根本から外れていると思われるか、小さなニュアンスが欠けているだけであるかに関係なく、あなたの考えを共有して、私が軌道に乗るのを手伝ってください. ありがとう!

4

3 に答える 3

1

Josh Smith の MVVM の実装には固有の問題がいくつかあります。この件に関する Ward Bell の投稿 ( http://neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.html ) をご覧ください。ViewModel の最初のアプローチを採用し、この結合を断ち切る Caliburn などの代替 MVVM フレームワークを確認することをお勧めします。

于 2010-03-26T18:35:43.840 に答える
0

RelayCommandは、ビューにバインドできるViewModelのコマンドを取得するための単なる方法です。

さまざまなMVVMアーキテクチャのバリエーションとサンプルアプリのすべてから離れて、古き良きOODを使用する傾向があると思います。TreeViewVmおよびListViewVm用のある種のViewModel基本クラス(つまり、DetailsViewModelBase)を持っていないのはなぜですか。サブクラスが共有するのと同じくらい多くの実装を持つ(またはない場合は抽象化する)CanDeleteメソッドとDeleteメソッド、およびSelectedItemを使用してDeleteCommandをそこに配置します。次に、SelectedItemを以下のxamlのようなコントロールにバインドします。

    <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、
ベリール

于 2010-03-26T20:38:28.757 に答える
0

Kent Boogaart が ActiveAwareCommand と呼んでいるものについて説明しているブログ投稿を見つけました。まだ試していませんが、これは私が探していたものを実行しているようです。投稿へのコメントでは、Prism の IActiveAware が同様の動作をしていると言及しています。

于 2010-03-27T05:34:43.020 に答える