0

我正在尝试在 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}"/>
4

1 回答 1

1

所有者类型必须是声明属性的类型,这里DataGridColumnExtensions

public static DependencyProperty FilterDisplayTypeProperty =
    DependencyProperty.RegisterAttached("FilterDisplayType", 
         typeof(FilterDisplayTypeEnum),
         typeof(DataGridColumnExtensions), // here
         inheritsMetaData);

这似乎是对附加属性的常见误解。另请参见此处

还要注意,绑定到附加属性的语法是(Class.Property),所以你需要像这样绑定:

<TextBox
    Text="{Binding Path=(DataGridColumnExtensions.FilterDisplayType)}"/>

还有一点需要注意:我还不太明白为什么该属性继承。据我所知,您打算在 DataGridTextColumn 对象上显式设置它。

于 2012-04-05T08:14:50.303 回答