WPF DataGrid RowHeader数据绑定

w51jfk4q  于 2023-10-22  发布在  其他
关注(0)|答案(6)|浏览(177)

我有一个DataGrid,绑定到DataTable。我想在RowHeader中显示文本,以实现如下功能:

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

这是可能的吗?如果是,我该怎么做?

vwoqyblh

vwoqyblh1#

我试了两个答案,没有一个对我有效。我要做的就是把它们混合在一起。
这对我很有效:

<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属性,这也是我绑定的对象。

kupeojn6

kupeojn62#

有两种方法可以做到这一点,前面的例子几乎有它,但绑定将无法解析属性,因为表达式缺少“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;
    }
}
enyaitl3

enyaitl33#

仅供参考,如果你直接绑定到一个数据表,那么这个绑定文本对我来说是有效的:

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

Item.Row.Header路径中,路径从DataGridRow开始,Item带你到DataGridViewRow带你到DataRow
同样,如果您直接绑定到数据表。

shstlldc

shstlldc4#

尝试设置rowheader模板,类似于以下内容

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

        //your stuff
</DataGrid>
rdlzhqv9

rdlzhqv95#

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

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

那就差不多了问题是这会导致每行的行标题相同。

3hvapo4f

3hvapo4f6#

你几乎就在那里了,只是将DataStorType更改为DataGridRow而不是DataGrid,那么每行的行标题都会不同,例如。

相关问题