私は Datagrid を持っていますが、クリックされた (別名選択された) 行のビューモデルでダブルクリック コマンドを起動する回避策が気に入りません。
意見:
<DataGrid EnableRowVirtualization="True"
ItemsSource="{Binding SearchItems}"
SelectedItem="{Binding SelectedItem}"
SelectionMode="Single"
SelectionUnit="FullRow">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<cmd:EventToCommand Command="{Binding MouseDoubleClickCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
...
</DataGrid>
ビューモデル:
public ICommand MouseDoubleClickCommand
{
get
{
if (mouseDoubleClickCommand == null)
{
mouseDoubleClickCommand = new RelayCommand<MouseButtonEventArgs>(
args =>
{
var sender = args.OriginalSource as DependencyObject;
if (sender == null)
{
return;
}
var ancestor = VisualTreeHelpers.FindAncestor<DataGridRow>(sender);
if (ancestor != null)
{
MessengerInstance.Send(new FindDetailsMessage(this, SelectedItem.Name, false));
}
}
);
}
return mouseDoubleClickCommand;
}
}
ビュー モデル内のビュー関連のコード (依存オブジェクトとビジュアル ツリー ヘルパーを含むコード) を削除したいと考えています。しかし一方で、このようにして、ユーザーが行ではなくヘッダーをクリックしたときに何かが発生するのを回避します。
PS: 添付されたビヘイビアーを調べてみましたが、職場で Skydrive からダウンロードできないため、「組み込み」のソリューションが最適です。