2011-01-25 187 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;`