2009-11-23 34 views
7

Trong điều khiển Silverlight 3 điều khiển người dùng của tôi Tôi đang hiển thị điều khiển cơ bản DataGrid. Tôi cần phải tạo ra các cột lập trình như sau:Cách đặt DataContext trên Tiêu đề cột DataGrid

Style headerStyle = (Style)Resources["ColumnHeaderStyle"]; 
DataGridTextColumn col = new DataGridTextColumn(); 
col.HeaderStyle = headerStyle; 
dataGrid.Columns.Add(col); 

Các phong cách được định nghĩa như sau:

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" 
     TargetType="prim:DataGridColumnHeader"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel Loaded="StackPanel_Loaded"> 
        <TextBlock Text="{Binding Name}" /> 
        <TextBlock Text="{Binding Data}" /> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Tôi muốn thiết lập bối cảnh dữ liệu của tiêu đề cho một đối tượng "tiêu đề" (với các thuộc tính "Tên" và "Dữ liệu" được tham chiếu trong DataTemplate). Thật không may, tôi không thể sử dụng sự kiện StackPanel_Loaded như được đề xuất elsewhere, bởi vì trình xử lý sự kiện cũng được gọi khi người dùng bắt đầu một cột kéo hoạt động thả &.

Cách chính xác để đặt DataContext của tiêu đề cột DataGrid là gì?

Trả lời

6

Hóa ra rằng người ta có thể sử dụng Tiêu đề sở hữu (đó là kiểu Object) là DataContext cho DataTemplate (thiết lập như hình trên):

Style headerStyle = (Style)Resources["ColumnHeaderStyle"]; 
DataGridTextColumn col = new DataGridTextColumn(); 
col.HeaderStyle = headerStyle; 
col.Header = myHeaderDataContext; // DataContext for ColumnHeaderStyle 
dataGrid.Columns.Add(col); 
+0

không hoàn toàn là cách tiếp cận mà tôi đã giải quyết nhưng +1 để giải thích rằng Thuộc tính tiêu đề là DataContext. –

5

Đây là cách bạn sẽ làm điều đó trong XAML (điều này làm việc trong WPF; không chắc chắn nếu nó hoạt động trong SL)

<DataGridTextColumn Binding="{Binding Path=Discount}"> 
    <DataGridTextColumn.HeaderStyle> 
     <Style TargetType="DataGridColumnHeader"> 
      <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.DiscountHeader}" /> 
     </Style> 
    </DataGridTextColumn.HeaderStyle> 
</DataGridTextColumn> 
+0

Tôi đã thử phương pháp này, và nó gần như hoạt động. Khi tôi databind * hai tên tiêu đề cột *, mỗi cột sẽ lấy tên của cột đầu tiên. Tôi đã tăng gấp đôi và gấp ba lần kiểm tra tài sản của tôi databinding, và không có bất kỳ sai lầm ngớ ngẩn, như xa như tôi có thể nói. Bất cứ ý tưởng những gì có thể gây ra điều này? – Dave

+0

bạn là người tiết kiệm cuộc sống. Cảm ơn rất nhiều và điều này đã làm việc hoàn hảo trên ứng dụng .Net 4.5 wpf. –

2

Dựa trên câu trả lời của Matt, tôi đã đưa ra các giải pháp của ràng buộc tiêu đề trên DataGridCellsPanel whi ch trong Snoop dường như có bối cảnh dữ liệu chính xác:

<DataGridTemplateColumn.HeaderStyle> 
    <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource CenterAlignedColumnHeaderStyle}"> 
     <Setter Property="Content" Value="{Binding Path=DataContext.Location, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" /> 
     </Style> 
    </DataGridTemplateColumn.HeaderStyle> 

Và đây là không xâm nhập theo cách mà bạn vẫn có thể kế thừa từ tiêu đề tùy chỉnh phong cách (xem dụ ở trên) hoặc sự kiện cơ sở cột kiểu header:

Giải pháp này có lợi thế là XAML thuần túy và sạch sẽ và tham khảo tổ tiên gần nhất giữ đúng datacontext thay vì cố gắng tiếp cận datacontext của các yếu tố phân cấp hàng đầu như UserControl.

+0

Cảm ơn bạn đã giải pháp tốt đẹp! Tôi lấy nó làm cơ sở cho ['solution'] của tôi (http://stackoverflow.com/questions/1658397/wpf-datagrid-header-text-binding/22065842#22065842), tất cả các bản quyền đều tuân thủ :). –

Các vấn đề liên quan