Kraft Datagrid in den Bearbeitungsmodus, wenn Listview für Celltemplate verwendet
-
29-09-2019 - |
Frage
Grüße,
In einer WPF Datagridtemplatecolumn Ich habe einen Celltemplate ein Listview mit und CellEditingTemplate ein Datagrid verwenden.
<DataTemplate x:Key="LimitsTemplate">
<ListView ItemsSource="{Binding Limits}" IsEnabled="False">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
<DataTemplate x:Key="LimitsEditingTemplate">
<toolkit:DataGrid ItemsSource="{Binding Limits}" ...>
...
</toolkit:DataGrid>
</DataTemplate>
Das Problem, das ich bin vor, wie die Spalte in dem Bearbeitungsmodus mit Doppelklick zu zwingen? Dies ist das Standardverhalten für die anderen Spalten und ich glaube, für das Datagrid im Allgemeinen. Durch Drücken von F2 startet den Bearbeitungsmodus, aber Doppelklick mit der Maus nicht.
Wenn ich die auf False ListView.IsEnabled dann die doppelten Klick funktioniert, aber dann habe ich eine Liste deaktiviert Ansicht, die nicht richtig und jeder Stil Hack fühlt sich an wie eine hässliche kludge sieht.
Beachten Sie, dass ich versucht habe, einzigen Klick Bearbeitung die nicht den Trick.
Jede Hilfe dankbar, danke!
Lösung
Natürlich, sobald ich fragen, SO, ist die Antwort materialisiert :) Wenn ich die FindVisualParent Methode aus der Klick Bearbeitung Trick und Draht, dass bis zu der Listenansicht einen Doppelklick auf das alles funktioniert wie erwartet:
<DataTemplate x:Key="LimitsTemplate">
<ListView ItemsSource="{Binding Limits}" PreviewMouseDoubleClick="limitsListView_PreviewMouseDoubleClick">
...
und in dem Code hinter:
static T FindVisualParent<T>(UIElement element) where T : UIElement
{
UIElement parent = element;
while (parent != null)
{
T correctlyTyped = parent as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
parent = System.Windows.Media.VisualTreeHelper.GetParent(parent) as UIElement;
}
return null;
}
void limitsListView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataGrid dataGrid = FindVisualParent<DataGrid>(sender as UIElement);
if (dataGrid != null)
{
dataGrid.BeginEdit();
}
}
Andere Tipps
Ich hatte sehr ähnliches Problem mit meinem Datagrid. Hier ist, was das Problem in meinem Projekt verursacht. Die Itemssource in meinem Datagrid zugewiesen ist eine benutzerdefinierte Liste, dass Geräte IEnumerable
implementiert ich diese Liste, so dass es unterschiedliche Objekt zurückgibt für verschiedene Anrufe aus dem gleichen Index .. wie wenn Sie die Liste aufrufen [0] das erste Mal ein Objekt zurückgibt, das den Namen „WPF“ zum Beispiel gilt, wenn man es so nennen wieder Liste [0] es für Sie ein völlig neues Objekt zurück, das den Wert „WPF“.
hältWenn also die Sammlung (Limits) Sie sind verbindlich zu, ist eine benutzerdefinierte Sammlung, dass Sie IEnumerable und IList Schnittstellen für sie umgesetzt, dann Umsetzung überprüfen. in meinem Fall war es den Index-Operator, IndexOf und enthält.