Реализация фильтрации (Text и Combobox) в DataGrid - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь создать код, позволяющий фильтровать DataGrid с помощью TextBox или ComboBox.Я уже установил код фильтрации для TextBox, а теперь для фильтра типа Combobox, я не очень уверен в подходе.

Во-первых, я унаследовал 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.Я буду использовать это значение свойства в 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>

Вышекод выполняется, но я получаю фильтры типа Combobox во всех столбцах, даже если для некоторых столбцов в качестве вложенного свойства установлен TextBox (FilterType).Это означает, что вышеуказанный триггер не работает.Любые идеи, как получить доступ к прикрепленному свойству, установлены в столбце данных.то есть.чтобы получить более точный доступ к нему в ColumnHeaderTemplate.

1 Ответ

0 голосов
/ 02 апреля 2012

Я бы позволил DataGrid сделать свое дело - отобразить данные, которые ему даны;Вместо фильтрации / сортировки / группировки коллекции, которая связана с источником данных сетки данных, существует тонна выборок, включая MSDN:

http://msdn.microsoft.com/en-us/library/ms752347.aspx#filtering

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...