我想在DataGridTextColumn上定義一個自定義附加屬性,並在我的xaml文件中爲它寫入一個DataTrigger。這是如何在我的類中定義附加屬性(FilterDisplayStyle)。在DataGridTextColumn的附加屬性上觸發
//Dependency Property whether Column Filter is combobox or textbox or editable combobox.
public static FrameworkPropertyMetadata inheritsMetaData =
new FrameworkPropertyMetadata(FilterDisplayTypeEnum.TextBoxOnly, FrameworkPropertyMetadataOptions.Inherits);
public static DependencyProperty FilterDisplayTypeProperty = DependencyProperty.RegisterAttached("FilterDisplayType",
typeof(FilterDisplayTypeEnum), typeof(DataGridColumn), inheritsMetaData);
public static FilterDisplayTypeEnum GetFilterDisplayType(DependencyObject target) {
if (target == null) { throw new ArgumentNullException("Invalid Parameter Element"); }
return (FilterDisplayTypeEnum)target.GetValue(FilterDisplayTypeProperty);
}
public static void SetFilterDisplayType(DependencyObject target, FilterDisplayTypeEnum value) {
if (target == null) { throw new ArgumentNullException("Invalid Parameter Element"); }
target.SetValue(FilterDisplayTypeProperty, value);
}
上面附加屬性的類型是FilterDisplayTypeEnum,它的定義如下。
public enum FilterDisplayTypeEnum {
TextBoxOnly,
NonEditableComboBox,
EditableComboBox
}
這裏是我在DataGridTextColumn設置該屬性
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" f:DataGridColumnExtensions.FilterDisplayType="NonEditableComboBox" />
....
</DataGrid.Columns>
現在我試圖使用檢索該屬性以下
<TextBox Text="{Binding Mode=OneWay, Path=FilterDisplayType, RelativeSource={RelativeSource AncestorType={x:Type DataGridTextColumn}}}"/>
但是我上面的TextBox沒有任何文字。令人驚訝的是,我有另一個附加屬性(這次連接到DataGrid),它完美地工作。該問題僅適用於DataGridTextColumn。此外,使用WPF Inspector,我發現Visual Tree中沒有DataGridTextColumn的直接可視化表示,所以我對是否可以在DataGridTextColumn的祖先上使用FindAncestor綁定方式表示懷疑。任何人都可以幫助我在這種情況下。 綜上所述,我無法使用FindAncestor類型的Binding訪問在DataGridTextColumn上定義的自定義附加屬性。有沒有其他辦法呢?
問候, NIRVAN
編輯: 按@Clemens建議,我改變附加屬性的定義是這樣的。但我仍然無法訪問我的xaml中的附加屬性。
附加屬性定義:
public static DependencyProperty FilterDisplayTypeProperty = DependencyProperty.RegisterAttached("FilterDisplayType",
typeof(FilterDisplayTypeEnum), typeof(DataGridColumnExtensions), inheritsMetaData);
public static FilterDisplayTypeEnum GetFilterDisplayType(DataGridBoundColumn target) {
if (target == null) { throw new ArgumentNullException("Invalid Parameter target"); }
return (FilterDisplayTypeEnum)target.GetValue(FilterDisplayTypeProperty);
}
public static void SetFilterDisplayType(DataGridBoundColumn target, FilterDisplayTypeEnum value) {
if (target == null) { throw new ArgumentNullException("Invalid Parameter target"); }
target.SetValue(FilterDisplayTypeProperty, value);
}
我仍然無法在我的XAML代碼訪問屬性「FilterDisplayType」下面
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=FilterDisplayType}"/>
確實有點奇怪,在這裏我們限制可以在GetProperty和SetProperty中擁有這個屬性的DO的類型(我相信)。但我仍然無法訪問該屬性。查看EDIT以查看我粘貼了附加屬性的更新定義的問題。 – Jatin 2012-04-05 10:01:42
只需要注意一下:我認爲'if(target == null){throw ...}'語句是無用的。 'target'永遠不會是'null',除非你用'null'參數顯式調用方法。 – Clemens 2012-04-05 10:40:57
請注意編輯後的答案。 – Clemens 2012-04-05 10:55:55