特定の状況でコマンドとしてイベントを実装する方法について少し混乱しています。MVVMを尊重したいのですが、この場合はどうすればよいかわかりません。
WPFの「ビュー」-viewCustomerSearchがあります。これにはいくつかのテキストボックスがあり、ユーザーが[検索]をクリックすると、結果がListViewに入力されます。viewCustomerSearchはviewmodelCustomerSearchにバインドされており、うまく機能します。
viewCustomerSearchはviewCustomerでホストされます。
viewCustomerSearchにカスタムコマンド(CustomerSelectedCommand)を公開させたいのですが、これはviesCustomerSearchのListViewがダブルクリックされるたびに「起動」され、viewCustomerの背後にあるviewmodel(viewmodelCustomer)によって処理されます。これは、理論上のMVVMパターンが正しく実装されているようです。
私は主な問題を3つの小さな問題に分解しましたが、うまくいけば、それらはすべて同じ課題の構成要素であることがわかります。
最初の問題:viewCustomerSearchにカスタムコマンドを公開させるには、このコードをviewCustomerSearchに配置する必要があるようです-これはMVVMを「壊す」ようです(ビューコードの後ろにコードがありません)。
public readonly DependencyProperty CustomerSelectedCommandProperty = DependencyProperty.Register("CustomerSelectedCommand", typeof(ICommand), typeof(viewCustomerSearch));
public ICommand CustomerSelectedCommand
{
get { return (ICommand)GetValue(CustomerSelectedCommandProperty); }
set { SetValue(CustomerSelectedCommandProperty, value); }
}
2番目の問題(そしてこれが本当に私に近づいている問題です):MVVMを壊す私が何をするかを示すことによって最もよく説明されます。ビューにイベントハンドラーがあります。
private void lstResults_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (CustomerSelectedCommand != null) CustomerSelectedCommand.Execute(((ViewModels.viewmodelCustomerSearchResult)this.lstResults.SelectedItem).CustomerId);
}
ええと...このイベントハンドラーをここに置くべきではないことを私は知っています。むしろ、viewmodelCustomerSearchでそれを処理するコマンドが必要です。ここでの2つの問題は
'CustomerSelectedCommand' ICommandはviewCustomerSearchに実装されているため、viewmodelCustomerSearchはそれを認識して起動することはできません。
ビューコードビハインドのイベントハンドラーではなく、MouseDoubleClickイベントをコマンドにバインドする方法がわかりません。添付プロパティについて読んでいますが、ここでどのように適用されるかわかりません。
(注意:アプリケーションの他の場所で一般的な「RelayCommand」を使用しています。これはここで機能しますか??)
3番目の問題:イベントハンドラーの背後にあるコードでコマンドを起動する非MVVMの方法を使用すると、選択された顧客IDを引数としてコマンドに渡していることがわかります。viewCustomerのコマンドハンドラーでその引数を確認するにはどうすればよいですか?それを処理するために新しいRelayCommandを作成しましたが、Executeメソッドは引数を取らないようですか?
上記のすべてを考えると、私は個人的に「MVVMはビューにコードがないことを意味します」を購読していないと言わなければなりません。それは私には気が狂っているようです。ビューに完全に関係し、ビューのみに関係するコードは、-IMHO-ビューモデルに含めるべきではありません。とはいえ、これは論理的なもののように見えます(ビューのものではありません)。
いくつかの洞察に感謝します。長い投稿でごめんなさい。あなたが「戦争と平和」で私を助けるのに十分な情報のバランスをとろうとしています。
DS