我有一个DataGrid,绑定到DataTable。我想在RowHeader中显示文本,以实现如下功能:
Col0 Col1 Col2 Col3 Table | 1 | 3 | 5 | 6 | Chair | 3 | 2 | 1 | 8 |
这是可能的吗?如果是,我该怎么做?
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中:
DataGridRow
TextBlock.Text
Header
ui_dataGrid.ItemsSource = dataSource.Rows;
注意:每个Row对象都有一个Header属性,这也是我绑定的对象。
Row
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; } }
enyaitl33#
仅供参考,如果你直接绑定到一个数据表,那么这个绑定文本对我来说是有效的:
{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=Item.Row.Header}
在Item.Row.Header路径中,路径从DataGridRow开始,Item带你到DataGridView,Row带你到DataRow。同样,如果您直接绑定到数据表。
Item.Row.Header
Item
shstlldc4#
尝试设置rowheader模板,类似于以下内容
<DataGrid> <DataGrid.RowHeaderTemplate> <DataTemplate> <TextBlock Text="{Binding YourProperty}"></TextBlock> </DataTemplate> </DataGrid.RowHeaderTemplate> //your stuff </DataGrid>
rdlzhqv95#
@michele:如果我修改绑定为:
<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/>
那就差不多了问题是这会导致每行的行标题相同。
3hvapo4f6#
你几乎就在那里了,只是将DataStorType更改为DataGridRow而不是DataGrid,那么每行的行标题都会不同,例如。
6条答案
按热度按时间vwoqyblh1#
我试了两个答案,没有一个对我有效。我要做的就是把它们混合在一起。
这对我很有效:
技巧是找到祖先
DataGridRow
,然后将TextBlock.Text
属性绑定到您关心的Item属性,在本例中为Header
(用XAML比用英语更容易说)。然后在.xaml.cs中:
注意:每个
Row
对象都有一个Header
属性,这也是我绑定的对象。kupeojn62#
有两种方法可以做到这一点,前面的例子几乎有它,但绑定将无法解析属性,因为表达式缺少“DataContext”。
第二种方法是创建一个转换器来获取绑定,在转换器中解析它并吐出你想要的任何字符串值:
转换器代码示例:
enyaitl33#
仅供参考,如果你直接绑定到一个数据表,那么这个绑定文本对我来说是有效的:
在
Item.Row.Header
路径中,路径从DataGridRow开始,Item
带你到DataGridView,Row
带你到DataRow。同样,如果您直接绑定到数据表。
shstlldc4#
尝试设置rowheader模板,类似于以下内容
rdlzhqv95#
@michele:如果我修改绑定为:
那就差不多了问题是这会导致每行的行标题相同。
3hvapo4f6#
你几乎就在那里了,只是将DataStorType更改为DataGridRow而不是DataGrid,那么每行的行标题都会不同,例如。