2011-01-25 16 views
29

Mam DataGrid, związany z DataTable. Chcę, aby wyświetlić tekst w RowHeader, aby osiągnąć coś takiego:DataFrid WPF DataGrid RowHeader

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

to możliwe, a jeśli tak, to w jaki sposób mogę to zrobić?

+1

Czy naprawdę myśli RowHeader, czy też miałeś zamiar powiedzieć ColumnHeader? – VoodooChild

Odpowiedz

2

spróbuj ustawić szablon rowheader, coś w tym

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

     //your stuff 
</DataGrid> 
0

@michele: Gdybym zmodyfikować wiązanie:

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

to prawie działa. Problem polega na tym, że powoduje to ten sam nagłówek wiersza dla każdego wiersza.

+0

OK, kiedy napisałem YourProperty miałem na myśli, że możesz powiązać RowHeader z dowolną właściwością pojedynczego rzędu dodawanego do siatki; możesz podać kawałek kodu, może będę mógł Ci pomóc! – michele

32

Próbowałem obu odpowiedzi, a żadna nie zadziałała. Zasadniczo musiałem je połączyć.

Działa to dla mnie:

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

Sztuką jest znalezienie przodka DataGridRow, następnie powiązać atrybut do własności swojego elementu TextBlock.Text że ci zależy, w tym przypadku Header (łatwiej powiedzieć w XAML niż angielski może).

Następnie w .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows; 

nb Każdy obiekt ma właściwość Header, do której również się zobowiązuję.

+3

+1: Ruszaj swoim złym ja. – Jeff

+0

Należy zauważyć, że ścieżka naprawdę jest "item.propertyname". _Jeśli ktoś może mi powiedzieć, jak dowiedzieć się, jakie właściwości są dostępne w datacontext środowiska wykonawczego, to by mi bardzo pomogło._ – LuckyLikey

1

Wystarczy FYI, jeśli wiążą się bezpośrednio do tabeli danych, to ten tekst wiążący pracował dla mnie:

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

szturchnął wokół trochę i okazało się, że w ścieżce Item.Row.Header, ścieżka rozpoczyna się na DataGridRow, Item przeniesie Cię do DataGridView, a przeniesie Cię do DataRow.

Ponownie, jeśli wiążesz bezpośrednio z tabelą danych.

5

2 sposoby na zrobienie tego, poprzedni przykład prawie go miał, ale wiązanie nie rozwiązałoby właściwości, ponieważ w wyrażeniu brakowało "DataContext".

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

     //your stuff 
</DataGrid> 

2-ty sposobem na to jest stworzenie konwertera aby uzyskać wiązanie, analizować go w konwerterze i wypluć niezależnie od wartości ciąg chcesz:

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