Подтвердить что ты не робот

WPF DataGrid RowHeader привязка данных

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

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

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

4b9b3361

Ответ 1

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

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

<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 к свойству Item, которое вас интересует, в этом случае Header (проще сказать, в XAML, чем английский, возможно).

Затем в .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows;

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

Ответ 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;
    }
}

Ответ 3

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

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

        //your stuff
</DataGrid>

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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