2011-01-25 39 views
29

Tôi có một DataGrid, ràng buộc với một DataTable. Tôi muốn hiển thị văn bản trong RowHeader, để đạt được một cái gì đó như thế này:WPF DataGrid RowHeader databinding

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

Điều này có thể và nếu có, làm cách nào tôi có thể làm điều này?

+1

Bạn có thực sự có nghĩa là RowHeader, hoặc đã làm bạn có nghĩa là để nói ColumnHeader? – VoodooChild

Trả lời

2

Cố gắng thiết lập các mẫu rowheader, một cái gì đó giống như

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

     //your stuff 
</DataGrid> 
0

@michele này: Nếu tôi thay đổi Binding để:

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

thì nó gần như hoạt động. Vấn đề là kết quả này trong cùng một tiêu đề hàng cho mỗi hàng.

+0

Ok, khi tôi viết YourProperty tôi có nghĩa là bạn có thể ràng buộc RowHeader với bất kỳ thuộc tính nào của một hàng bạn thêm vào lưới; vui lòng cung cấp một đoạn mã của bạn, có thể tôi có thể giúp bạn thêm! – michele

32

Tôi đã thử cả hai câu trả lời và không làm việc cho tôi. Về cơ bản những gì tôi phải làm là trộn chúng lại với nhau.

này làm việc cho tôi:

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

Bí quyết là để tìm tổ tiên DataGridRow, sau đó Ràng buộc TextBlock.Text thuộc tính để sở hữu hàng của mình rằng bạn quan tâm, trong trường hợp này Header (dễ dàng hơn nói trong XAML ngoài tiếng Anh có lẽ).

Sau đó, trong .xaml.cs:

ui_dataGrid.ItemsSource = dataSource.Rows; 

N.B. Mỗi đối tượng có thuộc tính Header cũng là thứ tôi ràng buộc.

+3

+1: Đá với bản thân xấu của bạn. – Jeff

+0

Lưu ý rằng đường dẫn thực sự là 'item.propertyname'. _Nếu ai đó có thể cho tôi biết làm thế nào để tìm ra các thuộc tính có sẵn trong datacontext của thời gian chạy, nó sẽ giúp tôi rất nhiều._ – LuckyLikey

1

Just FYI, nếu bạn liên kết trực tiếp đến một bảng dữ liệu, sau đó văn bản ràng buộc này làm việc cho tôi:

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

chọc xung quanh một chút và thấy rằng trong đường dẫn Item.Row.Header, con đường bắt đầu tại DataGridRow, số Item sẽ đưa bạn đến DataGridView và sẽ đưa bạn đến DataRow.

Một lần nữa, nếu bạn liên kết trực tiếp với bảng dữ liệu.

5

2 cách để làm điều đó, ví dụ trước gần như đã có nó nhưng ràng buộc sẽ không giải quyết được thuộc tính vì biểu thức bị thiếu "DataContext".

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

     //your stuff 
</DataGrid> 

cách thứ 2 để làm điều đó là tạo ra một chuyển đổi để có được những ràng buộc, phân tích nó trong bộ chuyển đổi và nhổ ra bất kỳ giá trị chuỗi bạn muốn:

<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;`