我有一个绑定到 DataTable 的 DataGrid。我想在行头中显示文本,以实现类似于以下内容的效果:
Col0 Col1 Col2 Col3
Table | 1 | 3 | 5 | 6 |
Chair | 3 | 2 | 1 | 8 |
这是否可能,如果是,我该如何实现?
我有一个绑定到 DataTable 的 DataGrid。我想在行头中显示文本,以实现类似于以下内容的效果:
Col0 Col1 Col2 Col3
Table | 1 | 3 | 5 | 6 |
Chair | 3 | 2 | 1 | 8 |
这是否可能,如果是,我该如何实现?
我尝试了两个答案,但都没有对我起作用。实际上,我不得不将它们混合在一起。
这个对我有用:
<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;
注意:每个Row
对象都有一个Header
属性,我绑定的就是它。
item.propertyname
。如果有人能告诉我如何在运行时的数据上下文中找出可用的属性,那将对我很有帮助。 - LuckyLikeyItem[0]
来获取第一列,而不是指定一个名称并使用此答案 https://stackoverflow.com/a/16460193/5762332 隐藏第一列。 - Magnetron<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<!--your stuff-->
</DataGrid>
第二种方法是创建一个转换器来获取绑定,解析它并输出您想要的任何字符串值:
<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;
}
}
提供信息,如果你直接绑定数据表,那么以下绑定文本适用于我:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Row.Header}
我稍微查看了一下,发现在 Item.Row.Header
路径中,路径从 DataGridRow 开始,Item
带你到 DataGridView,而 Row
带你到 DataRow。
同样地,如果你直接绑定数据表。
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>uff
//your stuff
</DataGrid>
@michele:如果我将绑定修改为:
<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/>
然后它几乎可以工作。问题在于这会导致每一行具有相同的行标题。