Jatin
Jatin

Reputation: 4063

Trigger on attached property of DataGridTextColumn

I am trying to define a custom attached property on DataGridTextColumn and writing a DataTrigger against it in my xaml file. Here is how the attached property (FilterDisplayStyle) is defined in my class.

//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);
}

The above attached property's type is FilterDisplayTypeEnum which is defined as below.

public enum FilterDisplayTypeEnum {
    TextBoxOnly,
    NonEditableComboBox,
    EditableComboBox
}

Here is how I set this property in DataGridTextColumn

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id}" f:DataGridColumnExtensions.FilterDisplayType="NonEditableComboBox" />
....

</DataGrid.Columns>

Now I am trying to retrieve this property in using the following

<TextBox Text="{Binding Mode=OneWay, Path=FilterDisplayType, RelativeSource={RelativeSource AncestorType={x:Type DataGridTextColumn}}}"/>

But I don't get any text on my TextBox above.

Surprisingly, I have another attached property (this time attached to DataGrid instead) that works perfectly fine. The issue is only with DataGridTextColumn. Also, using WPF Inspector, I see there is no direct visual representation of DataGridTextColumn in the Visual Tree , so I was skeptical whether I could use FindAncestor way of binding on ancestor which is DataGridTextColumn. Can anyone help me out in this scenario. To Summarize, I can't access a custom attached property defined on DataGridTextColumn using FindAncestor type of Binding. Are there any alternatives to this?

regards, Nirvan

Edit: As per @Clemens suggestions, I changed the definition of the Attached Property to something like this. But I still can't access the attached property in my xaml.

Attached Property Definition:

    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);
    }

I am still unable to access the property "FilterDisplayType" in my xaml code as given below

<TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=FilterDisplayType}"/>

Upvotes: 0

Views: 1396

Answers (1)

Clemens
Clemens

Reputation: 128060

The owner type must be the type that declares the property, here DataGridColumnExtensions:

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

This seems to be a common misunderstanding with attached properties. See also here.

And also note that the syntax for binding to an attached property is (Class.Property), so you would need to bind like this:

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

And just another note: i haven't quite understood why the property inherits. As far as i can see you intend to set it explicitly on DataGridTextColumn objects.

Upvotes: 1

Related Questions