Binden Sie den DoubleClick-Befehl von der DataGrid-Zeile an die VM
Ich habe ein Datagrid, und nicht, wie mein workaround, um das Feuer ein Doppel-klicken Sie auf den Befehl auf meinem viewmodel für die angeklickt (aka ausgewählt) Zeile.
Anzeigen:
<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;
}
}
Ich möchte, um loszuwerden, der anzeigen im Zusammenhang mit code (das mit dem dependency-Objekt und der visual tree Helfer) meiner Ansicht Modell, wie diese Pausen Testbarkeit irgendwie. Aber auf der anderen Seite auf diese Weise vermeide ich, dass etwas passiert, wenn der Benutzer nicht auf eine Zeile klicken, sondern auf den header zum Beispiel.
PS: ich habe versucht, einen Blick auf beigefügten Verhalten, aber ich kann nicht download von Skydrive zu arbeiten, also eine "eingebaute" Lösung wäre am besten.
InformationsquelleAutor der Frage metacircle | 2013-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht nutzen Sie einfach die
CommandParameter
?Dein Befehl ist so etwas wie dieses:
EDIT: ich verwende jetzt anstatt
Interaction.Triggers
:InformationsquelleAutor der Antwort blindmeis
Hier ist, wie Sie es umsetzen mit Hilfe eines angebrachten Verhalten:
EDIT: Jetzt Registern Verhalten auf
DataGridRow
eher alsDataGrid
so dassDataGridHeader
Klicks werden ignoriert.Verhalten:
Xaml:
Müssen Sie dann ändern Sie Ihre
MouseDoubleClickCommand
zu entfernen, dieMouseButtonEventArgs
parameter und ersetzen Sie es mit IhremSelectedItem
geben.InformationsquelleAutor der Antwort Richard E
Weg einfacher als jede der vorgeschlagenen Lösungen hier.
Ich bin mit diesem ein.
vom WPF DataGrid: CommandBinding einem Doppelklick statt mit Ereignissen
InformationsquelleAutor der Antwort Maslow
Können Sie versuchen, diese Problemumgehung:
In diesem Fall müssen Sie angeben
DataTemplate
für jede Spalte in derDataGrid
InformationsquelleAutor der Antwort Andrey Gordeev