2012-04-05 32 views
0

我想在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}"/> 

回答

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对象上明确地设置它。

+0

确实有点奇怪,在这里我们限制可以在GetProperty和SetProperty中拥有这个属性的DO的类型(我相信)。但我仍然无法访问该属性。查看EDIT以查看我粘贴了附加属性的更新定义的问题。 – Jatin 2012-04-05 10:01:42

+0

只需要注意一下:我认为'if(target == null){throw ...}'语句是无用的。 'target'永远不会是'null',除非你用'null'参数显式调用方法。 – Clemens 2012-04-05 10:40:57

+0

请注意编辑后的答案。 – Clemens 2012-04-05 10:55:55