Ho un Datagrid e non mi piace la mia soluzione alternativa per attivare un comando doppio clic sul mio viewmodel per la riga selezionata (aka selezionata).Associare il comando DoubleClick da DataGrid Row a VM
Vista:
<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;
}
}
voglio eliminare il codice relativo vista (quello con l'oggetto di dipendenza e l'albero di supporto visivo) nel mio modello vista, in quanto ciò rompe la testabilità in qualche modo. Ma d'altra parte in questo modo evito che qualcosa accada quando l'utente non fa clic su una riga ma sull'intestazione, ad esempio.
PS: Ho provato a dare un'occhiata ai comportamenti collegati, ma non riesco a scaricare da Skydrive al lavoro, quindi una soluzione "integrata" sarebbe la soluzione migliore.
Il problema non è ottenere l'elemento selezionato (è un database comunque sulla VM), ma ottenendo il comando di non eseguire quando, ad esempio, le intestazioni del datagrid vengono duplicate. – metacircle
se vuoi impedire a mousedoubleclick puoi provare PreviewMouseDoubleClick e impostare e.Handled = true per le tue condizioni. così puoi rielaborare il codice da viewmodel e metterlo in codebehind per il tuo datagrid – blindmeis
Ottima idea. In realtà ho fatto la stessa cosa nel mio codebehind per OnContextMenuOpening da sempre. A volte semplicemente non hai le idee giuste al momento giusto in mente. Grazie. Segnalo come risposta. – metacircle