it-swarm.com.ru

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

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

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

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

29
eriksmith200

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

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

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

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

33
markmuetz

Два способа сделать это, предыдущий пример почти имел это, но привязка не смогла бы разрешить свойство, потому что в выражении отсутствовал «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;
    }
}
5
denis morozov

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

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

        //your stuff
</DataGrid>
2
michele

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

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

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

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

1
Bryan Johnson

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

0
user1680868

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

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

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

0
eriksmith200