2011-01-25 15 views
29

Ho un DataGrid, associato a un DataTable. Voglio visualizzare il testo nella RowHeader, per ottenere qualcosa di simile:WPF DataGrid RowHeader che associa i dati

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

Questo è possibile e se sì, come posso fare questo?

+1

Vuoi davvero dire RowHeader, o fatto intendevi dire ColumnHeader? – VoodooChild

risposta

2

tenta di impostare il modello rowheader, qualcosa di simile

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

     //your stuff 
</DataGrid> 
0

@michele: Se modifico l'Associazione a:

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

allora quasi funziona. Il problema è che questo comporta la stessa intestazione di riga per ogni riga.

+0

Ok, quando ho scritto YourProperty intendevo che è possibile associare RowHeader a qualsiasi proprietà di una singola riga aggiunta alla griglia; sentiti libero di fornire un pezzo del tuo codice, forse posso aiutarti ulteriormente! – michele

32

Ho provato entrambe le risposte e nessuna ha funzionato per me. Essenzialmente quello che dovevo fare era mescolarli insieme.

questo funziona per me:

<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> 

Il trucco è quello di trovare l'antenato DataGridRow, quindi associare l'attributo TextBlock.Text alla proprietà del suo Item che vi preoccupate, in questo caso Header (più facile a dirsi in XAML di inglese può essere).

Poi negli .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows; 

N.B. Ogni oggetto ha una proprietà Header che è anche quello che sto vincolando.

+3

+1: Oscilla con te stesso. – Jeff

+0

Si noti che il percorso è in realtà 'item.propertyname'. _Se qualcuno potrebbe dirmi come capire quali proprietà sono disponibili nel datacontext di runtime, mi sarebbe di grande aiuto._ – LuckyLikey

1

Proprio A proposito, se si associa direttamente ad una tabella di dati, allora questo testo vincolante ha lavorato per me:

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

curiosato un po 'e ha scoperto che nel percorso Item.Row.Header, il percorso inizia dalla DataGridRow, lo Item ti porta allo DataGridView e lo ti porta al DataRow.

Ancora, se si associa direttamente alla tabella di dati.

5

2 modi per farlo, l'esempio precedente ne aveva quasi ma l'associazione non riusciva a risolvere la proprietà perché mancava l'espressione "DataContext".

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

     //your stuff 
</DataGrid> 

secondo modo per farlo è quello di creare un convertitore per ottenere il legame, analizzarlo nel convertitore e sputare qualsiasi valore stringa che si desidera:

<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;`