我正在尝试在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}"/>
答案 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对象上显式设置它。