我正在尝试在 DataGridTextColumn 上定义一个自定义附加属性,并在我的 xaml 文件中针对它编写一个 DataTrigger。这是在我的类中定义附加属性 (FilterDisplayStyle) 的方式。
//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 的直接可视表示,所以我怀疑是否可以使用 FindAncestor 绑定祖先的方式,即 DataGridTextColumn。任何人都可以在这种情况下帮助我。总而言之,我无法使用 FindAncestor 类型的 Binding 访问在 DataGridTextColumn 上定义的自定义附加属性。有没有其他选择?
问候, 尼尔文
编辑: 根据@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}"/>