2012-04-05 85 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