2009-11-18 9 views
2

Il s'agit d'une question de suivi d'un article précédent (here).Liaison de colonne dynamique dans Xaml

J'ai des informations d'en-tête stockées comme: Dictionary<string,string> - où la première chaîne représente le nom du champ, et la seconde le titre que je veux afficher.

J'ai un ensemble de données dynamiques qui est stocké comme: Dictionary<string, object> - où chaîne est le nom du champ.

Je lie à ce en XAML comme:

<data:DataGrid Name="_dataGrid" AutoGenerateColumns="True" IsReadOnly="False" Margin="5" Height="200"> 
      <data:DataGrid.Columns> 
       <data:DataGridTextColumn Header="Forename" CanUserSort="True" SortMemberPath="Forename" 
              Binding="{Binding Converter={StaticResource RowIndexConverter}, 
              ConverterParameter=Forename}"/> 
       <data:DataGridTextColumn Header="Surname" CanUserSort="True" SortMemberPath="Surname" 
             Binding="{Binding Converter={StaticResource RowIndexConverter}, 
              ConverterParameter=Surname}"/> 
       <data:DataGridTextColumn Header="Age" CanUserSort="True" SortMemberPath="Age" 
             Binding="{Binding Converter={StaticResource RowIndexConverter}, 
              ConverterParameter=Age}"/> 
       <data:DataGridTextColumn Header="Shoesize" CanUserSort="True" SortMemberPath="Shoesize" 
             Binding="{Binding Converter={StaticResource RowIndexConverter}, 
              ConverterParameter=Shoesize}"/>     
      </data:DataGrid.Columns> 
     </data:DataGrid> 

Problème 1 Je veux autogenerate ces colonnes (en utilisant les informations d'en-tête fourni)

Problème 2 Je veux que les colonnes soient généré en fonction de quel type de données ils sont (c.-à-d. booléen = case à cocher)

Problème 3 Idéalement, je J'aimerais aussi spécifier le temps qu'un bouton devrait exister dans la première colonne ou non (c.-à-d. un bouton d'édition/vue) par liaison de données

Répondre

2

Je l'ai utilisé une approche qui suit le modèle de ce pseudo-code

columns = New DynamicTypeColumnList() 
columns.Add(New DynamicTypeColumn("Name", GetType(String))) 
dynamicType = DynamicTypeHelper.GetDynamicType(columns) 

DynamicTypeHelper.GetDynamicType() génère un type avec des propriétés simples. Voir this post pour les détails sur la façon de générer un tel type

ensuite d'utiliser effectivement le type, faire quelque chose comme ça

Dim rows as List(Of DynamicItem) 
Dim row As DynamicItem = CType(Activator.CreateInstance(dynamicType), DynamicItem) 
row("Name") = "Foo" 
rows.Add(row) 
dataGrid.DataContext = rows 
+0

clairement il y a beaucoup de détails à l'écart de cette explication, mais vous devez définir sur le bon chemin. – kenwarner

+0

Ahh, oui - j'ai déjà étudié la méthode de Vladimir Bodurov. Et c'est vraiment cool. Cependant, mon problème avec ce que la génération de type dynamique signifie que vous ne pouvez pas utiliser la frappe forte au moment du design (et le débogage au moment de l'exécution renvoie null). Colin a un bon post ici: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page- 1/# comment-5535 Ce qui explique une façon plus «standard» de faire les choses. Il nécessite quelques réglages lors de l'utilisation avec des contrôles différents, mais le code C# est une solution très élégante. –