2017-12-30 57 views
0

diese Quelle Gegeben: external code baseRolle diskreter wpf Abhängigkeitseigenschaft erhalten und setzen extentions

und diese statische Klasse speziell:

public static class TreeViewItemBehavior 
{ 

public static bool GetIsBroughtIntoViewWhenSelected(TreeViewItem treeViewItem) 
{ 
    return (bool)treeViewItem.GetValue(IsBroughtIntoViewWhenSelectedProperty); 
} 

public static void SetIsBroughtIntoViewWhenSelected(
    TreeViewItem treeViewItem, bool value) 
{ 
    treeViewItem.SetValue(IsBroughtIntoViewWhenSelectedProperty, value); 
} 

public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty = 
    DependencyProperty.RegisterAttached(
    "IsBroughtIntoViewWhenSelected", 
    typeof(bool), 
    typeof(TreeViewItemBehavior), 
    new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged)); 

static void OnIsBroughtIntoViewWhenSelectedChanged(
    DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
{ 
    TreeViewItem item = depObj as TreeViewItem; 
    if (item == null) 
     return; 

    if (e.NewValue is bool == false) 
     return; 

    if ((bool)e.NewValue) 
     item.Selected += OnTreeViewItemSelected; 
    else 
     item.Selected -= OnTreeViewItemSelected; 
} 

static void OnTreeViewItemSelected(object sender, RoutedEventArgs e) 
{ 
    // Only react to the Selected event raised by the TreeViewItem 
    // whose IsSelected property was modified. Ignore all ancestors 
    // who are merely reporting that a descendant's Selected fired. 
    if (!Object.ReferenceEquals(sender, e.OriginalSource)) 
     return; 

    TreeViewItem item = e.OriginalSource as TreeViewItem; 
    if (item != null) 
     item.BringIntoView(); 
} 

#endregion // IsBroughtIntoViewWhenSelected 

}

Was die Rolle der "Get" und "Set" vorfixierte Methoden? Das Hinzufügen dieser Klasse und das Festlegen einer TreeView.ItemControlsStyle-Setter-Eigenschaft in XAML auf die statische Abhängigkeitseigenschaft und ihr Wert auf "True" funktionieren wie erwartet. Wenn ich sowohl die get und Satz vorangestellt Methoden kommentieren und neu kompilieren, klagt Intellisense, dass das Eigentum des Stils nicht null sein kann, noch Kompilation ist nach wie vor erfolgreich, und die Funktionalität von

static void OnIsBroughtIntoViewWhenSelectedChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e) 

wird gehalten.

Die Beschwerde bleibt, wenn beide Methodennamen in irgendeiner Weise geändert werden, die Beschwerde fehlt, wenn nur eine Methode auskommentiert/modifiziert wird.

Ist dies ein alternatives Mittel zum Implementieren von Eigenschaft get und set? Sucht das Steuerelement automatisch eine "Get/Set + PropertyName" -Erweiterungsmethode in XAML? Wie/Warum kann das funktionieren, wenn die Erweiterungen "get" und "set" deaktiviert/auskommentiert sind? Die Klasse und der XAML-Ref können unter dem angegebenen Link gefunden werden. Ich habe die angegebene XAML-Eigenschaft ref geändert, indem ich sie als x: Static deklariert habe, und das ist die einzige Änderung. Vielen Dank für jede Einsicht ...

Antwort

1

Ein Blick in die Dokumentation:

DependencyProperty.RegisterAttached Method (String, Type, Type, PropertyMetadata, ValidateValueCallback)

führt zu attached-properties-overview wo Schaffung von ihnen im Detail beschrieben wird:

Auszug:

So erstellen Sie eine angefügte Eigenschaft

Wenn Ihre Klasse die angefügte Eigenschaft ausschließlich für die Verwendung mit anderen Typen definiert, muss die Klasse nicht von DependencyObject abgeleitet werden. Sie müssen jedoch von DependencyObject ableiten, wenn Sie dem allgemeinen WPF-Modell folgen, bei dem die angefügte Eigenschaft auch eine Abhängigkeitseigenschaft sein soll.

Definieren Sie Ihre angefügten Eigenschaft als Abhängigkeitseigenschaft durch ein DependencyPropertypublicstaticreadonly Felder vom Typ deklarieren. Sie definieren dieses Feld, indem Sie den Rückgabewert der RegisterAttached-Methode verwenden. Der Feldname muss mit dem angehängten Eigenschaftsnamen und der Zeichenfolge Eigenschaft übereinstimmen, um dem festgelegten WPF-Muster der Benennung der identifizierenden Felder im Vergleich zu den von ihnen dargestellten Eigenschaften zu folgen. Die beigefügte Eigenschaft Provider muss auch staticGet Property und Set Property Methoden bieten als für das angeschlossene Eigenschaftenaccessoren; Wenn Sie dies nicht tun, kann das Eigenschaftensystem Ihre angefügte Eigenschaft nicht verwenden.

usw.

Es ist einfach, sie zu deklarieren, was sich von der normalen DependencyProperties-Syntax unterscheidet.

Verwandte Themen