2011-01-25 28 views
29

Tengo un DataGrid, vinculado a una DataTable. Quiero mostrar el texto en el RowHeader, para lograr algo como esto:WPF DataGrid RowHeader databinding

  Col0  Col1  Col2  Col3 
Table | 1 | 3 | 5 | 6 | 
Chair | 3 | 2 | 1 | 8 | 

Es esto posible y si es así, ¿cómo se puede hacer esto?

+1

¿Realmente quiere decir RowHeader, o lo hizo ¿Querías decir ColumnHeader? – VoodooChild

Respuesta

2

intenta establecer la plantilla rowheader, algo como esto

<DataGrid> 
     <DataGrid.RowHeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding YourProperty}"></TextBlock> 
      </DataTemplate> 
     </DataGrid.RowHeaderTemplate>uff 

     //your stuff 
</DataGrid> 
0

@michele: Si modifico la unión a:

<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/> 

entonces casi funciona. El problema es que esto da como resultado el mismo encabezado de fila para cada fila.

+0

Ok, cuando escribí YourProperty, quise decir que puede vincular el RowHeader a cualquier propiedad de una sola fila que agregue a la grilla; siéntete libre de proporcionar una parte de tu código, ¡quizás pueda ayudarte más! – michele

32

Intenté ambas respuestas, y ninguna me funcionó. Esencialmente, lo que tenía que hacer era mezclarlos.

Esto funciona para mí:

<DataGrid name="ui_dataGrid> 
    <DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
             AncestorType={x:Type DataGridRow}}, 
             Path=Item.Header}"/> 
     </DataTemplate> 
    </DataGrid.RowHeaderTemplate> 
</DataGrid> 

El truco es encontrar el ancestro DataGridRow, a continuación, enlazar el atributo TextBlock.Text a la propiedad de su artículo que se preocupa, en este caso Header (más fácil decirlo en XAML de Inglés tal vez).

Luego, en los .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows; 

N. B. Cada objeto tiene una propiedad Header que es lo que también estoy vinculando.

+3

+1: Rock con tu mal yo. – Jeff

+0

Tenga en cuenta que la ruta es realmente 'item.propertyname'. _Si alguien me dijera cómo averiguar qué propiedades hay disponibles en el contexto de datos de runtime, me ayudaría mucho_. – LuckyLikey

1

Para su información, si enlaza directamente a una tabla de datos, entonces este texto vinculante trabajó para mí:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
            AncestorType={x:Type DataGridRow}}, 
            Path=Item.Row.Header} 

hurgó un poco y encontró que en el camino Item.Row.Header, la ruta se inicia en el DataGridRow, Item lo lleva al DataGridView, y lo lleva al DataRow.

Nuevamente, si se vincula directamente a la tabla de datos.

5

2 maneras de hacerlo, el ejemplo anterior casi lo tenía pero el enlace no pudo resolver la propiedad porque faltaba la expresión "DataContext".

<DataGrid> 
     <DataGrid.RowHeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding DataConext.YourProperty}"></TextBlock> 
      </DataTemplate> 
     </DataGrid.RowHeaderTemplate>uff 

     //your stuff 
</DataGrid> 

segunda forma de hacerlo es crear un convertidor para conseguir la unión, analizarlo en el convertidor y escupir lo que sea valor de cadena que desee:

<Views:DataGridRowDataContextToRowHeaderValueConverter x:Key="toRowHeaderValue"/> 

<DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
         AncestorType={x:Type DataGridRow}}, 
         Converter={StaticResource toRowHeaderValue}}"/> 
     </DataTemplate> 
</DataGrid.RowHeaderTemplate> 

//sample converter code 
public class DataGridRowDataContextToRowHeaderValueConverter :IValueConverter 
{ 
public object Convert (object value, Type targetType, object parameter, 
         CultureInfo culture) 
{  
    var dataGridRow = (DataGridRow) value; 
    var row = (GridModelExtensions.HourRow) dataGridRow.DataContext; 
    return row.Days[0].Hour;`