我想在DataGridTextColumn上定义一个自定义附加属性,并在我的xaml文件中为它写入一个DataTrigger。这是如何在我的类中定义附加属性(FilterDisplayStyle)。在DataGridTextColumn的附加属性上触发
//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建议,我改变附加属性的定义是这样的。但我仍然无法访问我的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}"/>
确实有点奇怪,在这里我们限制可以在GetProperty和SetProperty中拥有这个属性的DO的类型(我相信)。但我仍然无法访问该属性。查看EDIT以查看我粘贴了附加属性的更新定义的问题。 – Jatin 2012-04-05 10:01:42
只需要注意一下:我认为'if(target == null){throw ...}'语句是无用的。 'target'永远不会是'null',除非你用'null'参数显式调用方法。 – Clemens 2012-04-05 10:40:57
请注意编辑后的答案。 – Clemens 2012-04-05 10:55:55