Mam Datagrid i nie podoba mi się moje obejście, aby uruchomić polecenie dwukrotnego kliknięcia w moim modelu widoku dla klikniętego (oznaczonego aka) wiersza.Powiąż polecenie DoubleClick z wiersza DataGrid do VM
Widok:
<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;
}
}
Chcę pozbyć się widoku związane kodu (jednego z obiektem zależnościach i wizualne drzewo pomocnika) w moim modelu widoku, jak to w jakiś sposób psuje sprawność. Ale z drugiej strony unikam tego, że coś się dzieje, gdy użytkownik nie kliknie wiersza, ale na przykład w nagłówku.
PS: Próbowałem rzucić okiem na załączone zachowania, ale nie mogę pobrać ze Skydrive w pracy, więc najlepiej byłoby "wbudowane" rozwiązanie.
Problem nie polega na pobraniu wybranego elementu (jest to databound tak czy inaczej na maszynie wirtualnej), ale uzyskanie polecenia, aby nie wykonywać, gdy na przykład nagłówki datagridu są klikane podwójnie. – metacircle
jeśli chcesz zapobiec mousedoubleclick możesz spróbować PreviewMouseDoubleClick i ustawić e.Handled = true dla twoich warunków. dzięki czemu można przeobrazić kod z viewmodel i umieścić go w codebehind dla swojego datagrid – blindmeis
Świetny pomysł. Właściwie robiłem to samo w moim kodzie dla OnContextMenuOpening cały czas. Czasami po prostu nie masz odpowiednich pomysłów we właściwym czasie. Dzięki. Zaznaczę to jako odpowiedź. – metacircle