我正在嘗試放置一些代碼,以允許通過TextBox或ComboBox過濾DataGrid。我已經爲TextBox提供了過濾代碼,現在對於Combobox類型的過濾器,我不太確定這種方法。在DataGrid中實現篩選(文本和組合框)
首先,我繼承了DataGrid,並將所有過濾代碼放在那裏。爲了在DataGrid上放置Filter,我選擇了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>
上面的代碼運行的相關部分,但我即使一些列具有文本框設置爲附加屬性(過濾式)的所有列中獲取組合框式過濾器。這意味着上面的觸發器不起作用。任何想法如何訪問datagrid Column中設置的附屬屬性。即。請在ColumnHeaderTemplate中訪問它以更加精確。
我不認爲你是正確的參照值,如果它是一個枚舉。嘗試FilterTypeEnum.NonEditableComboBox – Paparazzi 2012-04-02 14:36:37
其實,我曾嘗試過,但wpf抱怨「FilterTypeEnum.NonEditableComboBox不是FilterTypeEnum的有效值」。我也嘗試使用fg:FilterTypeEnum.NonEditableComboBox,它導致相同的「無效值」 – Jatin 2012-04-02 14:47:54
不知道如何將轉換器放入觸發器,或者甚至確定是否可以完成,但這是我會嘗試。你可以看到即將發生的事情,甚至發現異常情況。 – Paparazzi 2012-04-02 15:33:21