2011-04-22 40 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>