2012-04-02 27 views
0

我正在嘗試放置一些代碼,以允許通過TextBox或ComboBox過濾DataGrid。我已經爲TextBox提供了過濾代碼,現在對於Combobox類型的過濾器,我不太確定這種方法。在DataGrid中實現篩選(文本和組合框)

首先,我繼承了DataGrid,並將所有過濾代碼放在那裏。爲了在DataGrid上放置Filter,我選擇了DataGrid的標題。我不想控制使用繼承的DataGrid類中定義的附加屬性顯示哪種類型的過濾器。這是其中的一個標識要使用的過濾器類型(文本框或組合框)。

public class FilteringDataGrid : DataGrid { 
     .... 
     //Dependency Properties for Combobox or Text search. 
     public static DependencyProperty FilterTypeProperty = DependencyProperty.RegisterAttached("FilterType", 
       typeof(FilterTypeEnum), typeof(DataGrid), new PropertyMetadata(FilterTypeEnum.TextBoxOnly)); 

它設置在DataGridColumn級別。

在DataGrid ColumnHeaderTemplate中,我試圖讀取上面附加的屬性。但是我不知道如何訪問ColumnHeaderTemplate中Column級別的屬性。我將在Trigger中使用此屬性值來呈現TextBox或Combobox作爲過濾器。 如何在ColumnHeaderTemplate(或精確模板觸發器)中訪問此屬性的值。

這裏是DataGrid的ColumnHeaderTemplate

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:fg="clr-namespace:ThemingControls.CustomControls"> <!--Inherited DataGrid Control namespace --> 

        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
           <Grid> 
             <Grid> 
              <Grid.RowDefinitions> 
               <RowDefinition Height="Auto"/> 
               <RowDefinition Height="Auto"/> 
              </Grid.RowDefinitions>  
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="Auto"/> 
               <ColumnDefinition Width="*"/> 
              </Grid.ColumnDefinitions> 
              <ContentPresenter Grid.Column="0" Grid.Row="0" 
              .... 
              <Path x:Name="SortArrow" 
              Grid.Column="1" Grid.Row="0" 
              .... 
    <!-- Combobox or TextBox show either one based on Column FilterType attached Property --> 
              <ComboBox Grid.Row="1" Grid.ColumnSpan="2" IsEditable="False" 
                 /> 
              <fg:DelayTextBox Grid.Row="1" Grid.ColumnSpan="2" /> 
              .... 

<!-- Triggers to show TextBox/Combobox based on attached property of column --> 

           <ControlTemplate.Triggers> 
            <Trigger Property="fg:FilteringDataGrid.FilterType" Value="NonEditableComboBox"> 
             <Setter Property="fg:DelayTextBox.Visibility" Value="Collapsed"/> 
            </Trigger> 
           </ControlTemplate.Triggers> 

上面的代碼運行的相關部分,但我即使一些列具有文本框設置爲附加屬性(過濾式)的所有列中獲取組合框式過濾器。這意味着上面的觸發器不起作用。任何想法如何訪問datagrid Column中設置的附屬屬性。即。請在ColumnHeaderTemplate中訪問它以更加精確。

+0

我不認爲你是正確的參照值,如果它是一個枚舉。嘗試FilterTypeEnum.NonEditableComboBox – Paparazzi 2012-04-02 14:36:37

+0

其實,我曾嘗試過,但wpf抱怨「FilterTypeEnum.NonEditableComboBox不是FilterTypeEnum的有效值」。我也嘗試使用fg:FilterTypeEnum.NonEditableComboBox,它導致相同的「無效值」 – Jatin 2012-04-02 14:47:54

+0

不知道如何將轉換器放入觸發器,或者甚至確定是否可以完成,但這是我會嘗試。你可以看到即將發生的事情,甚至發現異常情況。 – Paparazzi 2012-04-02 15:33:21

回答