我试图设置一些代码,允许DataBox通过TextBox或ComboBox进行过滤。我已经为TextBox设置了过滤代码,现在对于Combobox类型的过滤器,我不太确定这种方法。
首先,我继承了DataGrid,并将所有过滤代码放在那里。为了将Filter放在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(或准确的模板触发器)中访问此属性的值。
这是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)。这意味着上面的触发器不起作用。任何想法如何访问datagrid列中设置的附加属性。即。在ColumnHeaderTemplate中访问它更精确。
答案 0 :(得分:0)
我会让DataGrid做它的事情 - 显示它给出的数据;而是过滤/排序/分组绑定到数据网格的Itemsource的集合,有大量样本包括MSDN:
http://msdn.microsoft.com/en-us/library/ms752347.aspx#filtering