2012-04-05 11 views
0

Ich versuche, eine benutzerdefinierte angefügte Eigenschaft in DataGridTextColumn zu definieren und einen DataTrigger dagegen in meiner XAML-Datei zu schreiben. Hier ist, wie die angefügte Eigenschaft (FilterDisplayStyle) in meiner Klasse definiert ist.Auslöser für angefügte Eigenschaft von 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); 
} 

Der oben angeführte Eigenschaftstyp ist FilterDisplayTypeEnum, der wie folgt definiert ist.

public enum FilterDisplayTypeEnum { 
    TextBoxOnly, 
    NonEditableComboBox, 
    EditableComboBox 
} 

Hier ist, wie ich diese Eigenschaft in Datagridtextcolumn gesetzt

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

</DataGrid.Columns> 

Jetzt versuche ich, diese Eigenschaft zum Abrufen bei der Verwendung der folgenden

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

Ich bekomme oben keinen Text auf meiner TextBox.

Überraschenderweise habe ich eine andere angefügte Eigenschaft (diesmal an DataGrid gebunden), das funktioniert einwandfrei. Das Problem tritt nur bei DataGridTextColumn auf. Mit WPF Inspector sehe ich auch, dass es keine direkte visuelle Repräsentation von DataGridTextColumn in der visuellen Struktur gibt. Daher war ich skeptisch, ob ich die FindAncestor-Methode für die Bindung an einen Vorgänger verwenden könnte, nämlich DataGridTextColumn. Kann mir jemand in diesem Szenario helfen? Zusammenfassend kann ich nicht auf eine benutzerdefinierte angefügte Eigenschaft zugreifen, die in DataGridTextColumn mithilfe des FindAncestor-Bindungstyps definiert ist. Gibt es Alternativen dazu?

Grüßen, Nirvan

Edit: Per @Clemens Vorschläge, ich die Definition der angefügte Eigenschaft zu so etwas wie dies geändert. Aber ich kann immer noch nicht auf die angehängte Eigenschaft in meinem XAML zugreifen. Definition

Befestigt Eigentum:

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

ich noch nicht in der Lage bin die Eigenschaft "FilterDisplayType" in meinem XAML-Code für den Zugriff auf, wie nachfolgend beschrieben

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

Antwort

1

Der Eigentümer Typ muss der Typ sein, der erklärt die Eigenschaft, hier DataGridColumnExtensions:

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

Dies scheint ein häufiges Missverständnis mit attached properties zu sein. Siehe auch here.

Und auch beachten Sie, dass die syntax for binding an einen angeschlossenen Immobilie ist (Class.Property), so dass Sie so binden, müssten:

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

Und eine andere Anmerkung: Ich habe nicht ganz verstanden, warum die Eigenschaft inherits. Soweit ich sehen kann, beabsichtigen Sie, es explizit auf DataGridTextColumn-Objekte zu setzen.

+0

In der Tat ein wenig seltsam, hier beschränken wir den Typ von DO, die diese Eigenschaft in GetProperty und SetProperty haben kann (glaube ich). Trotzdem kann ich die Immobilie nicht erreichen. Siehe den EDit zu meiner Frage, wo ich die aktualisierte Definition meiner angehängten Eigenschaft eingefügt habe. – Jatin

+0

Nur eine Anmerkung: Ich denke, die 'if (Ziel == null) {throw ...}' Aussagen sind nutzlos. 'target' wird nie' null' sein, es sei denn, Sie rufen die Methoden explizit mit 'null'-Argumenten auf. – Clemens

+0

Bitte beachte die bearbeitete Antwort. – Clemens

Verwandte Themen