WPF DataGrid RowHeader привязка данных - PullRequest
29 голосов
/ 25 января 2011

У меня есть DataGrid, связанный с DataTable.Я хочу отобразить текст в RowHeader, чтобы добиться чего-то вроде этого:

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

Возможно ли это, и если да, то как я могу это сделать?

Ответы [ 6 ]

33 голосов
/ 10 февраля 2011

Я попробовал оба ответа, но ни один из них не помог мне. По сути, мне нужно было смешать их вместе.

Это работает для меня:

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

Хитрость заключается в том, чтобы найти предка DataGridRow, а затем связать атрибут TextBlock.Text с интересующим его свойством Предмета, в данном случае Header (проще сказать в XAML, чем в английском, может быть).

Тогда в .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows;

N.B. Каждый объект Row имеет свойство Header, к которому я также привязываю.

5 голосов
/ 02 сентября 2011

2 способа сделать это, предыдущий пример почти имел это, но привязка не смогла бы разрешить свойство, потому что в выражении отсутствовал "DataContext."

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

        <!--your stuff-->
</DataGrid>

2-й способ сделать это - создать конвертер для получения привязки, проанализировать его в конвертере и выложить любое желаемое строковое значение:

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

Пример кода конвертера:

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;
    }
}
2 голосов
/ 25 января 2011

Попробуйте установить шаблон rowheader, что-то вроде этого

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

        //your stuff
</DataGrid>
1 голос
/ 03 марта 2011

Просто к вашему сведению, если вы привязываете напрямую к таблице данных, то этот текст привязки сработал для меня:

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

Немного побродил и обнаружил, что в пути Item.Row.Header путь начинается с DataGridRow , Item ведет вас к DataGridView и Row перенесет вас в DataRow .

Опять же, если вы связываетесь непосредственно с таблицей данных.

0 голосов
/ 11 сентября 2018

Вы были почти там, просто измените AncestorType на DataGridRow вместо DataGrid , тогда заголовки строк будут разными для каждой строки, например,

0 голосов
/ 25 января 2011

@ michele: Если я изменю привязку на:

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

тогда это почти работает. Проблема в том, что это приводит к одному и тому же заголовку для каждой строки.

...