WPF数据表格行标题数据绑定

34

我有一个绑定到 DataTable 的 DataGrid。我想在行头中显示文本,以实现类似于以下内容的效果:

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

这是否可能,如果是,我该如何实现?


1
你是真的指RowHeader吗,还是你想说的是ColumnHeader? - VoodooChild
6个回答

41

我尝试了两个答案,但都没有对我起作用。实际上,我不得不将它们混合在一起。

这个对我有用:

<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。如果有人能告诉我如何在运行时的数据上下文中找出可用的属性,那将对我很有帮助。 - LuckyLikey
你也可以使用 Item[0] 来获取第一列,而不是指定一个名称并使用此答案 https://stackoverflow.com/a/16460193/5762332 隐藏第一列。 - Magnetron

6
有两种方法可以实现这一点,上一个例子几乎已经做到了,但绑定会失败,因为表达式缺少 "DataContext" 属性。
<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;
    }
}

2

提供信息,如果你直接绑定数据表,那么以下绑定文本适用于我:

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

我稍微查看了一下,发现在 Item.Row.Header 路径中,路径从 DataGridRow 开始,Item 带你到 DataGridView,而 Row 带你到 DataRow

同样地,如果你直接绑定数据表。


2
尝试设置行标题模板,类似以下内容:
<DataGrid>
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding YourProperty}"></TextBlock>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>uff

        //your stuff
</DataGrid>

0

@michele:如果我将绑定修改为:

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

然后它几乎可以工作。问题在于这会导致每一行具有相同的行标题。


好的,当我写YourProperty时,我的意思是您可以将RowHeader绑定到网格中添加的任何单行属性;请随意提供您的代码片段,也许我可以帮助您进一步! - michele

0
你已经接近成功了,只需要将AncestorType更改为DataGridRow而不是DataGrid,那么每一行的行标题将会有所不同,例如:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接