Я успешно настроил свою сетку данных для поддержки filtering
. Все, что я сделал, - это создал DataTemplate , который содержал кнопку переключения и всплывающее окно с TextBox , служащим полем поиска фильтра. Я создал по два для каждого столбца (всего 2) таким образом в <DataGrid.Resources></DataGrid.Resources>
Вот мой xaml:
<DataTemplate x:Key="FooHeaderTemplate">
<Grid Margin="0, 0, -5, 0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentControl Content="{Binding}" VerticalAlignment="Center"/>
<ToggleButton Name="FooFilterButton"
Grid.Column="1"
Width="25"
Height="25"
Margin="0, 1, 5, 1"
Padding="1, 0" BorderBrush="{x:Null}" Foreground="{x:Null}" Background="{x:Null}">
<ToggleButton.Content>
<Image Stretch="Fill">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger
Binding="{Binding DataContext.IsFooFilterApplied, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Value="True">
<Setter Property="Source" Value="/Foo.Bar.FooApplication;component/Resources/filter-applied.png"/>
</DataTrigger>
<DataTrigger
Binding="{Binding DataContext.IsFooFilterApplied, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Value="False">
<Setter Property="Source" Value="/Foo.Bar.FooApplication;component/Resources/filter-doff.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</ToggleButton.Content>
</ToggleButton>
<Popup IsOpen="{Binding ElementName=FooFilterButton, Path=IsChecked}" PlacementTarget="{Binding ElementName=FooFilterButton}" Placement="Left" StaysOpen="False" HorizontalAlignment="Right">
<Border Background="White" Padding="3">
<TextBox Width="300" Text="{Binding DataContext.FooFilterSearchBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</Border>
</Popup>
</Grid>
</DataTemplate>
Как видите, у меня есть уникальные свойства, связанные с этим DataTemplate , относящийся к определенному столбцу. Я продублировал этот DataTemplate и изменил его Name и привязку свойств для соответствия следующему столбцу.
В его нынешнем виде работает как надо. Я нажимаю кнопки фильтра, и появляется всплывающее окно, я ввожу строковое значение, и данные таблицы обновляются по мере ввода. Более того, график c для кнопки фильтра изменяется, чтобы указать, когда фильтр применяется для этого конкретного столбца.
Проблема в том, что мне пришлось продублировать тот же DataTemplate . Думаю, все в порядке, если у меня есть только два столбца для фильтрации, но как насчет DataGrid с 7 столбцами, и мне нужно добавить фильтр для каждого?
У меня такой вопрос: есть ли способ использовать только один DataTemplate , а затем изменить его для каждого столбца?
Заранее большое спасибо!