2010-02-22 12 views
9

estoy Encuadernación una cuadrícula de datos a datos dinámicos a través de IDictionary: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681Cómo agregar dinámicamente un convertidor de código subyacente

Pero no desea definir ninguna columna en el XAML (a continuación es cómo se hace en Colin el post de Eberhardt

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

Así que he escrito el siguiente código para tratar de hacer lo mismo en el código detrás, pero el código no llamar a la RowIndexConverter Algo debe faltar

código:..

// 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 código (aquí por el contexto):

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

Respuesta

8

El convertidor se llama después de recibir los datos a través de la ruta de la propiedad. Como no hay una propiedad "Nombre" en la fila, no funciona (puede ver la excepción de enlace en la ventana de resultados).

Lo resuelto cambiando la definición de encuadernación a:

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

ya que no puede tener propiedades de unión sin una ruta (la excepción llegué sin la segunda línea) de dos vías. Tener una ruta de propiedad no tiene sentido, pensándolo bien, ya que queremos enlazar al objeto Fila completa, no a una de sus propiedades.

Nota: probado con VS 2008 SP1, proyecto WPF.

+0

Ahh, gran trabajo, gracias. –

Cuestiones relacionadas