我有一個Datagrid,並且不喜歡我的解決方法在點擊(又名選定)行的viewmodel上觸發雙擊命令。將DoubleClick命令從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下載,所以'內置'解決方案將是最好的。
問題是沒有得到所選項目(這是數據綁定無論如何在虛擬機上),但是當例如數據網格的頭部被雙擊時得到命令不執行。 – metacircle
如果你想防止mousedoubleclick你可以嘗試PreviewMouseDoubleClick併爲您的條件設置e.Handled = true。所以你可以從viewmodel中取代代碼並將它放在你的數據網格的代碼隱藏文件中 – blindmeis
好主意。其實我一直在爲我的代碼隱藏OnContextMenuOpening一直做同樣的事情。有時候,你只是在正確的時間沒有正確的想法。謝謝。我打算將此標記爲答案。 – metacircle