2010-08-17 3 views
1

Salutations,DataGrid force en mode d'édition lors de l'utilisation ListView pour CellTemplate

J'ai Dans un WPF DataGridTemplateColumn un CellTemplate en utilisant un ListView et un CellEditingTemplate en utilisant une grille de données.

<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> 

Le problème auquel je suis confronté est de savoir comment forcer la colonne en mode édition en double-clic? C'est le comportement par défaut pour les autres colonnes et je crois pour le DataGrid en général. En appuyant sur F2 commence le mode d'édition, mais un double clic en utilisant la souris ne fonctionne pas. Si je mets le ListView.IsEnabled à False alors le double clic fonctionne, mais alors j'ai une vue de liste désactivée qui ne me semble pas correcte et n'importe quel hack de style me semble être un kludge moche. Notez que j'ai essayé single click editing qui n'a pas fait l'affaire.

Toute aide appréciée, merci!

Répondre

1

Bien sûr, dès que je demande SO, la réponse se matérialise :) Si j'utilise la méthode FindVisualParent du single click editing trick et le fil que jusqu'à la vue de la liste cliquez deux fois sur tout fonctionne comme prévu:

<DataTemplate x:Key="LimitsTemplate"> 
    <ListView ItemsSource="{Binding Limits}" PreviewMouseDoubleClick="limitsListView_PreviewMouseDoubleClick"> 
    ... 

et dans le code derrière:

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(); 
    } 
} 
0

J'ai eu un problème très similaire avec mon DataGrid. Voici ce qui a causé le problème dans mon projet: La ItemsSource dans mon DataGrid est assignée une liste personnalisée qui implémente IEnumerable.

J'ai implémenté cette liste pour qu'elle renvoie un objet différent pour différents appels du même index .. comme si vous appelez list [0] la première fois qu'elle renvoie un objet qui contient le nom "WPF" par exemple si vous appelez il liste à nouveau [0] il vous retournera un objet complètement nouveau qui contient la valeur "WPF". Par conséquent, si la collection (Limites) à laquelle vous vous liez est une collection personnalisée à laquelle vous avez implémenté des interfaces IEnumerable et IList, vérifiez votre implémentation. dans mon cas, c'était l'opérateur d'index, IndexOf et Contient.

My Blog

Questions connexes