WPF DataGrid RowHeader数据绑定

时间:2011-01-25 09:45:34

标签: wpf data-binding datagrid datatable row

我有一个绑定到DataTable的DataGrid。我想在RowHeader中显示文本,以实现这样的目的:

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

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

6 个答案:

答案 0 :(得分:33)

我尝试了两个答案,但都没有为我工作。基本上我要做的就是将它们混合在一起。

这对我有用:

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

答案 1 :(得分:5)

2种方法,prev示例几乎有它,但绑定将无法解析属性,因为表达式缺少“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 :(得分:2)

尝试设置rowheader模板,类似这样

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

        //your stuff
</DataGrid>

答案 3 :(得分:1)

仅供参考,如果您直接绑定到数据表,那么这个绑定文本对我有用:

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

稍微调整一下,发现在Item.Row.Header路径中,路径从 DataGridRow 开始,Item将您带到 DataGridView Row将您带到 DataRow

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

答案 4 :(得分:0)

@michele:如果我将Binding修改为:

<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/> 
然后它几乎可以工作。问题是这会导致每行的行标题相同。

答案 5 :(得分:0)

您几乎就在那儿,只需将AncestorType更改为 DataGridRow 而不是 DataGrid ,那么每一行的行标题都会不同,例如