2010-02-22 10 views
9

Je suis la liaison d'un Datagrid aux données dynamiques via IDictionary: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681Comment ajouter dynamiquement un convertisseur de code-behind

Mais je ne veux pas définir les colonnes dans le XAML (ci-dessous est de savoir comment il se fait dans Colin poste de Eberhardt

<data:DataGrid.Columns> 
    <data:DataGridTextColumn Header="Forename" Binding="{Binding Converter={StaticResource RowIndexConverter}, ConverterParameter=Forename}" /> 
</data:DataGrid.Columns> 

J'ai donc écrit le code suivant pour essayer de faire la même chose dans le code derrière, mais le code ne remet pas le RowIndexConverter Quelque chose doit manquer

code:..

// add columns 

DataGridTextColumn textColumn = new DataGridTextColumn(); 
textColumn.Header = "Forename"; 

Binding bind = new Binding("Forename"); 
bind.Converter = new RowIndexConverter() ; 
bind.ConverterParameter = "Forename";    

textColumn.Binding = bind; 
_dataGrid.Columns.Add(textColumn); 

Reste du code (ici pour le contexte):

// generate some dummy data 
Random rand = new Random(); 
for (int i = 0; i < 200; i++) 
{ 
    Row row = new Row(); 
    row["Forename"] = s_names[rand.Next(s_names.Length)]; 
    row["Surname"] = s_surnames[rand.Next(s_surnames.Length)]; 
    row["Age"] = rand.Next(40) + 10; 
    row["Shoesize"] = rand.Next(10) + 5; 

    _rows.Add(row); 
} 

// bind to our DataGrid 
_dataGrid.ItemsSource = _rows;  

public class Row 
{ 
    private Dictionary<string, object> _data = new Dictionary<string, object>(); 

    public object this[string index] 
    { 
     get 
     { 
      return _data[index]; 
     } 
     set 
     { 
      _data[index] = value; 
     } 
    } 
} 

Répondre

8

Le convertisseur est appelé après avoir obtenu les données par le chemin de la propriété. Comme il n'y a pas de propriété "Forename" dans Row, cela ne fonctionne pas (vous pouvez voir l'exception Binding dans la fenêtre Output).

Je l'ai résolu en changeant la définition se liant à:

Binding bind = new Binding(); 
    bind.Mode = BindingMode.OneWay; 

que vous ne pouvez pas avoir deux voies de liaison sans chemin (l'exception que je suis arrivé sans la deuxième ligne). N'avoir aucun chemin de propriété a du sens, à la réflexion, car nous voulons lier à l'objet Row complet, pas à l'une de ses propriétés.

Note: testé avec VS 2008 SP1, projet WPF.

+0

Ahh, excellent travail, merci. –