WPF DataGrid RowHeader привязка данных
У меня есть DataGrid, привязанный к DataTable. Я хочу отобразить текст в RowHeader, чтобы добиться чего-то вроде этого:
Col0 Col1 Col2 Col3
Table | 1 | 3 | 5 | 6 |
Chair | 3 | 2 | 1 | 8 |
Возможно ли это, и если да, то как я могу это сделать?
Ответы
Ответ 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, тогда заголовки строк будут разными для каждой строки, например