Forza DataGrid in modalità di modifica quando si utilizza ListView per CellTemplate
-
29-09-2019 - |
Domanda
Saluti,
In un WPF DataGridTemplateColumn Ho un CellTemplate utilizzando un ListView e un CellEditingTemplate utilizzando un DataGrid.
<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>
Il problema che sto affrontando è come forzare la colonna in modalità di modifica su doppio click? Questo è il comportamento di default per le altre colonne e credo che per il DataGrid in generale. Premendo F2 si avvia modalità di modifica, ma un doppio click con il mouse non è così.
Se ho impostato il ListView.IsEnabled False poi le opere doppio clic, ma poi ho una lista disabile vista che non sembra ritiene di destra e di qualsiasi Hack stile come un brutto kludge.
Si noti che ho provato la modifica solo click che non ha fatto il trucco.
Qualsiasi aiuto apprezzato, grazie!
Soluzione
Naturalmente, non appena chiedo Quindi, la risposta si materializza :) Se uso il metodo FindVisualParent dal modifica solo click trucco e filo che fino alla visualizzazione elenco fare doppio clic su di esso tutte le opere come previsto:
<DataTemplate x:Key="LimitsTemplate">
<ListView ItemsSource="{Binding Limits}" PreviewMouseDoubleClick="limitsListView_PreviewMouseDoubleClick">
...
e nel codice dietro:
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();
}
}
Altri suggerimenti
Ho avuto problemi molto simile con il mio DataGrid. Ecco che cosa ha causato il problema nel mio progetto:. L'ItemsSource nel mio DataGrid viene assegnato un elenco personalizzato che implementa IEnumerable
ho implementato questa lista in modo che restituisca oggetto diverso per i diversi appelli della stesso indice .. come se si chiama lista [0] la prima volta che restituisce un oggetto che contiene il nome di "WPF", per esempio, se lo si chiama ancora una volta la lista [0] verrà restituito per voi un nuovo oggetto che contiene il valore "WPF".
Quindi, se la raccolta (Limits) si sono vincolanti per, è una collezione personalizzata che è stato implementato interfacce IEnumerable e IList per esso, quindi controllare l'implementazione. nel mio caso, è stato l'operatore di indice, IndexOf e Contiene.