3

現在、MVVM/Commands と ControlTemplates をいじっています。私がやろうとしていることは非常に簡単です。たとえば、ユーザーがそれぞれに対してアクションをトリガーできる人のリストが必要です。しかし、ボタンでリストから削除したいなどの理由で、イベント/コマンドハンドラーは人物オブジェクトではなく実行する必要があります。

これまでに行ったことは、PersonVM のリストを公開する VM を作成し、それぞれが個人オブジェクトを保持することでした。次に、個人を表示する ItemsControl を含む controltemplate を使用して CustomControl を作成しました。

すべてのデータがきれいに表示され、まったく問題ありません。

次に、ユーザーがリストから人を削除できるようにする部分を追加しようとしました。そこで、データテンプレートにボタンを追加しました。それでも問題ありません。

次のステップは、ボタンによってトリガーされるコマンドを公開することでした。

最初のアプローチは、Josh Smith の RelayCommand を使用することでした。そのため、そのうちの 1 つを PersonViewModel に追加し、ボタンにバインドしました。動作しますが、問題は、(コマンドの実行後に) 親 vm が処理しなければならないイベントを発生させる必要があることです。ますます多くのコマンドでコードが乱雑に見えるので、それは良くありません。

そのため、RoutedCommand を使用するようにすべてを作り直し、コントロール階層の上位レベルに CommandBinding を追加しようとしました。しかし、ControlTemplate ではビューモデルでメソッドを呼び出すことができないため、これは不可能です。

だから、その問題に対する正しいアプローチは何だろうと思っていますか?どういうわけか、私は間違った方向に進んでいると信じていますが、どこにあるのかわかりません。

ティア・マーティン

4

2 に答える 2

2

私が行ったことは、少し厄介な可能性がある場合は、RelativeSourceバインディングを使用して、DataContext(またはコマンドバインディング)を論理ツリーにバックアップすることです。

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}"
于 2009-12-31T16:24:04.873 に答える
0

MVVM パターンを使用してイベントを渡すと、Prism の Event Aggregatorが非常に便利であることがわかりました。これにより、疎結合通信を処理できます。

したがって、一般的に言えば、明示的な関係を持たないビュー モデル間で削除などのイベントを渡したい場合は、1 つのビュー モデルをサブスクライブして特定のイベント集約を探し、適切な場所からそれをトリガーします。

このアプローチにはいくつかのバリエーションがあると確信しているので、一見の価値があるかもしれません。

于 2010-01-01T07:46:24.817 に答える