Tôi có một DataGrid và không thích workaround của mình để kích hoạt lệnh double click trên viewmodel của tôi cho hàng được nhấp (aka selected).Bind Lệnh DoubleClick từ DataGrid Row đến VM
Xem:
<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>
ViewModel:
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;
}
}
Tôi muốn thoát khỏi quan điểm liên quan đến mã (một với đối tượng phụ thuộc và cây helper hình ảnh) trong mô hình quan điểm của tôi, vì điều này phá vỡ khả năng thử nghiệm bằng cách nào đó. Nhưng mặt khác theo cách này, tôi tránh điều gì đó xảy ra khi người dùng không nhấp vào một hàng nhưng trên tiêu đề chẳng hạn.
PS: Tôi đã thử xem xét các hành vi đính kèm, nhưng tôi không thể tải xuống từ Skydrive tại nơi làm việc, vì vậy giải pháp 'được tích hợp sẵn' sẽ là tốt nhất.
Vấn đề không nhận được các mục được chọn (nó là databound dù sao trên máy ảo), nhưng nhận lệnh không được thực thi khi, ví dụ, các tiêu đề của DataGrid được DoubleClick. – metacircle
nếu bạn muốn ngăn chặn mousedoubleclick bạn có thể thử PreviewMouseDoubleClick và đặt e.Handled = true cho các điều kiện của bạn. vì vậy bạn có thể mở lại mã từ viewmodel và đặt nó trong codebehind cho datagrid của bạn – blindmeis
Ý tưởng tuyệt vời. Trên thực tế tôi đã làm điều tương tự trong codebehind của tôi cho OnContextMenuOpening tất cả cùng. Đôi khi bạn không có ý tưởng đúng vào đúng thời điểm. Cảm ơn. Tôi sẽ đánh dấu điều này là câu trả lời. – metacircle