2011-04-22 101 views
0

嗨,我想实现一种方式来筛选我的记录在DataGrid中。我的想法是将TextBox放入每列的标题中。样式DataGridColumnHeader WPF中的样式

我这样做,具体取决于是否按下ToggleButton,但我遇到问题的方式,我在标题中应用样式。

如果我申请样式的DataGridColumn里面是这样的:

<DataGridTextColumn> 
    <DataGridTextColumn.HeaderTemplate> 
     <DataTemplate> 
      (...) 
     </DataTemplate> 
    </DataGridTextColumn.HeaderTemplate> 
</DataGridTextColumn> 

这将很好地工作!

但是,如果试图把这个样式我这样做是这样的:

<Style TargetType="{x:Type DataGridTextColumn}"> 
    <Setter Property="Template"> 
     <ControlTemplate> 
      (...) 
     </ControlTemplate> 
    </Setter> 
</Style> 

通过使用控件模板,我们将覆盖的背景和DataGridColumnHeader的所有默认布局,我不希望出现这种情况。我该如何做到这一点?

我真的很想做到这一点,以避免在XAML中重复代码。

在此先感谢!

回答

2

如果使用的DataTemplate方法的唯一原因是因为你想一次把它定义(在某个中央位置),然后在多个地方(如多列)使用它,你可以移动的DataTemplate来资源部分,为其分配一个资源密钥,并随时随地使用它。

方法如下:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <DataTemplate x:Key="MySpecialHeaderTemplate"> 
      <TextBox Text="Search..." /> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn 
         Binding="{Binding Id}" /> 
       <DataGridTextColumn HeaderTemplate="{StaticResource MySpecialHeaderTemplate}" 
         Binding="{Binding Name}" /> 
       <DataGridTextColumn HeaderTemplate="{StaticResource MySpecialHeaderTemplate}" 
         Binding="{Binding Age}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window>