2010-01-16 11 views
8

CanUserAddRows="True" seulement 'fonctionne' lorsqu'il y a déjà des données dans le ItemsSource du DataGrid. S'il se trouve qu'il n'y a aucune ligne dans la liste d'éléments d'origine, le DataGrid n'affiche pas de ligne placeholder pour la saisie de nouveaux éléments, même si j'ai défini CanUserAddRows="True". Pourquoi?!WPF DataGrid ne peut pas ajouter une ligne lorsque la source de données est vide

Merci à l'avance, Trindaz

+0

En outre, ce qui se passe est que vous ne pouvez pas faire défiler vers la droite pour voir les colonnes qui sont hors de l'écran, parce que vous n'avez pas de barres de défilement horizontales sans éléments. –

Répondre

2

Ce semblent être un problème connu avec DataGrid WPF. Voir la discussion here (à partir du 4ème commentaire) Aussi, il semble être corrigé dans .net 4. J'ai fait quelques tests pour ce problème sur les frameworks 3.5 et 4 (beta2). Pls, voir les résultats ci-dessous:

D'abord je définissais 3 types de collections d'objets:

public class TestGridItems0 : ArrayList 
{ 
} 

public class TestGridItems1 : List<TestGridItem> 
{ 
} 

public class TestGridItems2<T> : List<TestGridItem> 
{ 
} 

où TestGridItem est ci-dessous:

public class TestGridItem 
{ 
    public string One { get; set; } 
    public string Two { get; set; } 
    public string Three { get; set; } 
} 

.net 3.5

TestGridItems0 et TestGridItems1 n'a pas montré une ligne vide pour une collection vide; où TestGridItems2 a bien fonctionné.

.net 4

seulement TestGridItems0 ne montre pas la ligne de la collection vide; 2 autres ont bien fonctionné.

XAML pour la grille:

<my:DataGrid Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="True"> 
    <my:DataGrid.Columns> 
     <my:DataGridTextColumn Binding="{Binding One}" Header="One" /> 
     <my:DataGridTextColumn Binding="{Binding Two}" Header="Two" /> 
     <my:DataGridTextColumn Binding="{Binding Three}" Header="Three" /> 
    </my:DataGrid.Columns> 
</my:DataGrid> 

ci-dessous comment les éléments source a été attribué:

dataGrid.ItemsSource = new TestGridItems0(); 
dataGrid.ItemsSource = new TestGridItems1(); 
dataGrid.ItemsSource = new TestGridItems2<TestGridItem>(); 

espérons que cette aide, ce qui est

+0

Une simple conversion '.ToList()' a résolu le problème. Merci pour l'indice. –

1

Ajouter un article vide à votre ItemsSource puis retirez il. Vous devrez peut-être définir à nouveau CanUserAddRows sur true après cela. J'ai lu cette solution here: (Posts par Jarrey et Rick Roen)

J'ai rencontré ce problème lorsque j'ai défini la ItemsSource à DefaultView DataTable et la vue était vide. Les colonnes ont été définies mais il aurait dû être en mesure de les obtenir. Il h.