/ / Der Wert der Abhängigkeitseigenschaft wird nicht vererbt - wpf, Abhängigkeitseigenschaften

Der Wert der Abhängigkeitseigenschaft wird nicht übernommen - wpf, Abhängigkeitseigenschaften

Ich habe eine Abhängigkeitseigenschaft mit deklariert FrameworkPropertyMetadataOptions.Inherits:

public static class DesignerItemStyles {
public static readonly DependencyProperty HeaderBackgroundProperty =
DependencyProperty.RegisterAttached(
"HeaderBackground", typeof(Brush), typeof(DesignerItemStyles),
new FrameworkPropertyMetadata(
Brushes.DesignerViewElementHeaderBackground,
FrameworkPropertyMetadataOptions.Inherits));

/* Below are Get & Set as usual */
}

Es funktioniert irgendwie, aber irgendwie nicht im gesamten visuellen Baum. Hier ist ein Screenshot ContentPresenter die erben Wert von HeaderedDesignerItemChrome: Knoten, der Wert erbt

Und jetzt ein Screenshot mit dem Inhalt des ContentPresenterund erbt den Wert nicht. Es ist auch nicht auf etwas anderes festgelegt - es ist ein Standardwert: Direktes Kind, das nicht

Irgendeine Idee warum?

Antworten:

7 für die Antwort № 1

Dies zu verwenden ist nicht so einfach, da einige Regeln befolgt werden müssen, um Eigenschaften mit vererbbaren Werten zu implementieren. Hier sind sie:

Auf dem übergeordneten Element muss die Abhängigkeitseigenschaft als angehängte Eigenschaft definiert werden. Sie können weiterhin Property Getter / Setter deklarieren, die Eigenschaft muss jedoch angehängt werden. Hier ist eine einfache Erklärung:

public static readonly DependencyProperty InheritedValueProperty =
DependencyProperty.RegisterAttached("InheritedValue",
typeof(int), typeof(MyClass), new FrameworkPropertyMetadata(0,
FrameworkPropertyMetadataOptions.Inherits));
public static int GetInheritedValue(DependencyObject target)
{
return (int)target.GetValue(InheritedValueProperty);
}
public static void SetInheritedValue(DependencyObject target, int value)
{
target.SetValue(InheritedValueProperty, value);
}
public int InheritedValue
{
get
{
return GetTimeSlotDuration(this);
}
set
{
SetTimeSlotDuration(this, value);
}
}

Untergeordnete Objekte definieren ihre Instanz der Eigenschaft mit geerbtem Wert mithilfe von AddOwner. Im Folgenden finden Sie den Code für die Beispielklasse MyChildClass:

public static readonly DependencyProperty InheritedValueProperty;
public int InheritedValue
{
get
{
return (int)GetValue(InheritedValueProperty);
}
set
{
SetValue(InheritedValueProperty, value);
}
}
static MyChildClass()
{
InheritedValueProperty =
MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass),
new FrameworkPropertyMetadata(0,
FrameworkPropertyMetadataOptions.Inherits));
}

Der globale Standardwert bleibt erhalten und die Vererbung funktioniert weiterhin, wenn die Überladung einzelner Argumente verwendet wird ...

MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass));

Beachten Sie, dass sich die Eigenschaft in einer untergeordneten Klasse befindet, die als Standardabhängigkeitseigenschaft deklariert ist, und dass sie in Metadatenoptionen Vererben angibt.

Bei einer solchen Einrichtung werden MyChildClass, wenn sie visuell oder logisch übergeordnet zu MyClass sind, automatisch denselben Eigenschaftswert verwenden.

Also technisch gesehen, was Sie im Visual Tree sehentut, was du ihm gesagt hast. Es legt den Standardwert fest, den Sie ihm mitgeteilt haben, und die geerbten Steuerelemente erben vom Wert des übergeordneten Elements, das Ihr ContentPresenter ist


0 für die Antwort № 2

Das Eliminieren eines der beiden ContentPresenter (sichtbar in beiden Screenshots direkt über DesignerItemsPresenter) hat bei mir funktioniert. Ich neige dazu zu glauben, dass dies ein Fehler im WPF-Framework selbst war.