触发DataGridTextColumn的附加属性

时间:2012-04-05 06:40:58

标签: wpf wpfdatagrid wpf-4.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的直接可视化表示,所以我怀疑是否可以在祖先的DataGridTextColumn上使用FindAncestor绑定方式。任何人都可以在这种情况下帮助我。 要总结,我无法使用FindAncestor类型的Binding访问DataGridTextColumn上定义的自定义附加属性。有没有替代方案?

的问候, NIRVAN

修改 根据@Clemens的建议,我将Attached Property的定义更改为类似的内容。但是我仍然无法访问我的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}"/>

1 个答案:

答案 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对象上显式设置它。