2011-01-25 82 views
29

我有一个DataGrid,绑定到一个DataTable。我想在RowHeader中显示文本,以实现如下目的:WPF DataGrid RowHeader数据绑定

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

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

+1

你真正的意思的rowHeader,或做你打算说ColumnHeader? – VoodooChild 2011-01-25 09:53:22

回答

2

尝试设置的rowHeader模板,像这样

<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}}}"/> 

那么它几乎工作。问题是这导致每行的相同行标题。

+0

好吧,当我写YourProperty我的意思是你可以将RowHeader绑定到你添加到网格的单个行的任何属性;随时提供你的代码,也许我可以帮助你进一步! – michele 2011-01-25 20:13:07

32

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

这个工作对我来说:

<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,然后绑定在这种情况下HeaderTextBlock.Text属性及其产品的属性,你关心,(更容易在XAML说非英语也许)。

然后在.xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows; 

注:每个对象都有一个Header属性,这也是我所绑定的。

+3

+1:摇滚与你的坏自我。 – Jeff 2011-02-28 03:03:37

1

仅供参考,如果你直接绑定到数据表中,那么这个文本装订工作对我来说:

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

周围一点点拨开,发现在Item.Row.Header路径,该路径始于DataGridRow,则Item带你到的DataGridView和带您到的DataRow

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

5

2种方法可以做到这一点,前面的例子几乎都有,但绑定将无法解决属性,因为表达式缺少“DataContext”。

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

     //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> 

//sample converter code 
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;`