2012-04-02 2 views
0

TextBox 또는 ComboBox로 DataGrid를 필터링 할 수있는 일부 코드를 추가하려고합니다. 이미 TextBox에 대한 필터링 코드를 넣었고 이제는 Combobox 유형 필터에 대해 접근법에 대해 잘 모르겠습니다.DataGrid에서 필터링 (텍스트 및 콤보 상자) 구현

첫째, DataGrid를 상속 받았으며 모든 필터링 코드가 배치되었습니다. DataGrid에 필터를 배치하기 위해 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 (또는 정확하게 템플릿 트리거)의이 속성 값에 액세스하려면 어떻게합니까.

여기에 데이터 그리드 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> 

위의 코드 실행의 관련 부분이다하지만 일부 열은 텍스트 상자가 연결된 속성 (FilterType)로 설정에도 불구하고 모든 열에서 콤보 타입의 필터를 얻을. 이것은 위의 트리거가 작동하지 않는다는 것을 의미합니다. 모든 아이디어를 DataGrid 열에 연결된 속성 집합에 액세스하는 방법. 즉. 좀 더 정확하게 ColumnHeaderTemplate에 액세스하십시오.

+0

나는 그것을 열거 경우 제대로 값을 참조 생각하지 않는 대신/분류/그룹에게 데이터 그리드의 Itemsource에 바인딩 컬렉션을 필터, MSDN을 포함하여 샘플의 톤이있다 . Try FilterTypeEnum.NonEditableComboBox – Paparazzi

+0

사실, 전에 시도했지만 wpf는 "FilterTypeEnum.NonEditableComboBox가 FilterTypeEnum에 유효한 값이 아닙니다."라는 불평을했습니다. 나는 또한 fg : FilterTypeEnum.NonEditableComboBox를 사용하여 시도했는데 같은 "유효하지 않은 값"이되었다. – Jatin

+0

변환기를 트리거에 넣는 방법이나 변환기를 수행 할 수 있는지 확실하지 않지만 그 것이 무엇을 시도 할 것인가. 들어오는 내용과 잡히는 예외를 볼 수 있습니다. – Paparazzi

답변

관련 문제