2011-10-04 28 views
12

Tôi muốn trình đơn ngữ cảnh cho các tiêu đề cột của DataGrid khác với phần còn lại của ô. Vì vậy, việc sử dụng thuộc tính ContextMenu thông thường sẽ không hoạt động. Có DataGrid.RowHeaderTemplate, nhưng tôi không thể tìm thấy DataGrid.ColumnHeaderTemplate.Làm thế nào để thêm một trình đơn ngữ cảnh nhấp chuột phải vào Tiêu đề cột cho một DataFrid WPF 4?

Chỉnh sửa/Lưu ý: Cột được tạo động.

Trả lời

23

Target một phong cách chung cho tất cả DataGridColumnHeaders:

<DataGrid.Resources> 
     <ContextMenu x:Key="DataGridColumnHeaderContextMenu" ...> 
     </ContextMenu> 

     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="ContextMenu" 
        Value="{StaticResource DataGridColumnHeaderContextMenu}" /> 
     </Style> 
    </DataGrid.Resources> 

Nếu bạn muốn các menu ngữ cảnh khác nhau cho các tiêu đề cột khác nhau sau đó sử dụng trình kích hoạt:

 <DataGrid.Resources> 
     <ContextMenu x:Key="ColumnHeaderContextMenu1" ...> 
     </ContextMenu> 

     <ContextMenu x:Key="ColumnHeaderContextMenu2" ...> 
     </ContextMenu> 

     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Style.Triggers> 
       <Trigger Property="Content" Value="Column1"> 
        <Setter Property="ContextMenu" 
          Value="{StaticResource ColumnHeaderContextMenu1}" /> 
       </Trigger> 
       <Trigger Property="Content" Value="Column2"> 
        <Setter Property="ContextMenu" 
          Value="{StaticResource ColumnHeaderContextMenu2}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.Resources> 

Hy vọng t mũ giúp.

+0

Còn nếu bạn đang tạo các cột động? – MoonKnight

+0

Trong trường hợp cột động, giải pháp thứ hai sẽ vẫn giữ đúng giả định rằng bạn sẽ biết tên cột trước khi bàn tay. –

0

Nó phụ thuộc vào cách bạn đang tạo ra các cột của bạn, nếu bạn đang định nghĩa chúng trong XAML sau đó bạn có thể làm điều này:

<DataGrid DataContext="{Binding MyDataContext}" ItemsSource="{Binding MyItems}" AutoGenerateColumns="False">   
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age" > 
      <DataGridTextColumn.HeaderTemplate> 
       <DataTemplate> 
        <TextBlock Text="{TemplateBinding Content}" > 
         <TextBlock.ContextMenu> 
          <ContextMenu> 
           <MenuItem Header="Task _1" /> 
           <MenuItem Header="Task _2" /> 
           <MenuItem Header="Task _3" /> 
          </ContextMenu> 
         </TextBlock.ContextMenu> 
        </TextBlock> 
       </DataTemplate> 
      </DataGridTextColumn.HeaderTemplate> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
Các vấn đề liên quan