【问题标题】:Trigger on attached property of DataGridTextColumn触发 DataGridTextColumn 的附加属性
【发布时间】:2012-04-05 06:40:57
【问题描述】:

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

【问题讨论】:

    标签: wpf wpfdatagrid wpf-4.0


    【解决方案1】:

    所有者类型必须是声明属性的类型,此处为DataGridColumnExtensions

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

    这似乎是对attached properties 的常见误解。另见here

    还要注意,附加属性的syntax for binding(Class.Property),因此您需要像这样绑定:

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

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

    【讨论】:

    • 确实有点奇怪,这里我们限制了在GetProperty和SetProperty中可以有这个属性的DO的类型(我相信)。但我仍然无法访问该物业。请参阅我的问题的编辑,我在其中粘贴了附加属性的更新定义。
    • 请注意:我认为if (target == null) { throw ... } 声明是无用的。 target 永远不会是 null,除非您使用 null 参数显式调用方法。
    猜你喜欢
    • 2015-03-08
    • 2018-03-15
    • 2018-03-23
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2011-11-01
    相关资源
    最近更新 更多