2012-04-02 5 views
0

Ich versuche, Code zu erstellen, der es einem DataGrid ermöglicht, von einer TextBox oder einer ComboBox gefiltert zu werden. Ich habe bereits Code für die TextBox und jetzt für den Combobox-Filter Filter bin ich nicht sehr sicher über die Vorgehensweise.Implementieren von Filtern (Text und Combobox) in DataGrid

Erstens habe ich DataGrid geerbt und alle meine Filter-Code ist dort platziert. Um den Filter auf das Datagrid zu setzen, habe ich den Header des DataGrids ausgewählt. Ich möchte steuern, welche Art von Filter mit angefügten Eigenschaften angezeigt werden soll, die in der geerbten DataGrid-Klasse definiert sind. Hier ist einer von ihnen, der den zu verwendenden Filtertyp identifiziert (Textbox oder Combobox).

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)); 

Sie wird auf DataGridColumn-Ebene festgelegt.

Im DataGrid-ColumnHeaderTemplate versuche ich, die oben angefügte Eigenschaft zu lesen. Allerdings weiß ich nicht, wie Sie auf die Spaltenebene in ColumnHeaderTemplate zugreifen können. Ich werde diesen Eigenschaftswert in Trigger verwenden, um entweder TextBox oder Combobox als Filter darzustellen. Wie greife ich auf den Wert dieser Eigenschaft in ColumnHeaderTemplate (oder Template Trigger, um genau zu sein).

ist hier relevanten Teil des 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> 

Der obige Code läuft, aber ich Combobox Art Filter in allen Spalte erhalten, obwohl einige Spalten TextBox gesetzt, wie die angefügten Eigenschaft (Filtertype) haben. Dies bedeutet, dass der obige Trigger nicht funktioniert. Irgendwelche Ideen, wie man auf die angefügte Eigenschaft zugreift, die in der Datagrid-Spalte eingestellt ist. dh. Greife in ColumnHeaderTemplate darauf zu, um genauer zu sein.

+0

Ich glaube nicht, dass Sie richtig auf den Wert beziehen, wenn es sich um eine Aufzählung . Versuchen Sie FilterTypeEnum.NonEditableComboBox – Paparazzi

+0

Eigentlich hatte ich das schon einmal versucht, aber die WPF beschwert sich, dass "FilterTypeEnum.NonEditableComboBox ist kein gültiger Wert für FilterTypeEnum". Ich versuchte auch, fg: FilterTypeEnum.NonEditableComboBox zu verwenden und es resultiert der gleiche "ungültige Wert" – Jatin

+0

Nicht sicher, wie man einen Konverter in Auslöser setzt oder sogar sicher, wenn es getan werden kann, aber das ist, was ich versuchen würde. Sie können sehen, was kommt und sogar fangen und Ausnahme. – Paparazzi

Antwort