2013-07-04 40 views
11

Dường như tôi đã đánh một bức tường đang cố gắng sử dụng DataTemplates trên DataGrid của tôi. Những gì tôi đang cố gắng làm là sử dụng một mẫu để hiển thị hai hàng văn bản cho mỗi ô. Nhưng nó dường như không thể Bind cột trong bất kỳ cách nào.Ràng buộc DataGridTemplateColumn

Mã sau hy vọng cho thấy những gì tôi muốn làm. Lưu ý Ràng buộc cho mỗi cột: không có điều gì cho cột mẫu, và như vậy, xaml này không thể hoạt động được.

<Window.Resources> 
    <DataTemplate x:Key="DoubleField"> 
     <StackPanel> 
      <TextBlock Text="{Binding Value1}"/> 
      <TextBlock Text="{Binding Value2}"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Title}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Price}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
     <DataGridTemplateColumn CellTemplate="{StaticResource DoubleField}" Binding="{Binding Stuff}"/> // <- Binding does not exist for templatecolumn, I only wish it did 
    </DataGrid.Columns> 
</DataGrid> 

class MyListItem { 
    class DoubleItem { 
     string Value1 { get; set; } 
     string Value2 { get; set; } 
    }  
    DoubleItem Title { get; set; } 
    DoubleItem Price { get; set; } 
    DoubleItem Stuff { get; set; } 
} 

Tôi có phải chịu trách nhiệm sao chép toàn bộ DataTemplate vào mỗi cột để có sự ràng buộc khác nhau trên mỗi bản sao không? Chắc chắn có một cách tốt đẹp để đi xung quanh này? Hay tôi chỉ thiếu một cái gì đó một cách mù quáng một lần nữa?

+0

"Hay tôi chỉ thiếu một thứ gì đó hiển nhiên một lần nữa?" - tất cả chúng ta đã ở đó, đặc biệt là với WPF. –

Trả lời

4

Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng làm nhưng nếu bạn cần lấy DataContext của toàn bộ hàng, bạn có thể sử dụng liên kết RelativeSource để đi lên cây hình ảnh. Giống như vậy:

<DataTemplate x:Key="DoubleField"> 
    <StackPanel> 
     <TextBlock Text="{Binding DataContext.Value1, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/> 
     <TextBlock Text="{Binding DataContext.Value2, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/> 
    </StackPanel> 
</DataTemplate> 
+1

Vấn đề là thiếu khả năng ràng buộc khi tôi xác định một templatecolumn. Có vẻ như không phải là một cách để tôi nói rằng cột đầu tiên sẽ cung cấp cho trường Tiêu đề cho mẫu để hiển thị. –

+0

Biểu dữ liệu của cột mẫu đã được cung cấp kèm theo ngữ cảnh dữ liệu của hàng. – Gman