2010-02-22 12 views
9

sto legando un DataGrid a dati dinamici via IDictionary: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681Come aggiungere dinamicamente un convertitore in code-behind

Ma io non voglio definire tutte le colonne nel XAML (sotto è come si fa a Colin il post di Eberhardt

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

Così ho scritto il seguente codice per cercare di fare la stessa cosa nel codice dietro, ma il codice non chiamare il RowIndexConverter Qualcosa deve mancare

codice:..

// 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); 

resto del codice (qui per il contesto):

// 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; 
     } 
    } 
} 

risposta

8

Il convertitore è chiamato dopo aver ottenuto i dati attraverso il percorso di proprietà. Poiché non esiste una proprietà "Forename" in Row, non funziona (puoi vedere l'eccezione Binding nella finestra Output).

ho risolto modificando la definizione di rilegatura a:

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

come non si può avere vincolante senza un percorso (l'eccezione ho ottenuto senza la seconda linea) a due vie. Non avere un percorso di proprietà ha senso, a pensarci bene, poiché vogliamo associare l'intero oggetto Riga, non a una delle sue proprietà.

Nota: testato con VS 2008 SP1, progetto WPF.

+0

Ah, ottimo lavoro, grazie. –

Problemi correlati