WPF-Überschreibung von übergeordnetem Element ist aktiviert

Ich habe gerade nach einer Möglichkeit gesucht, ein untergeordnetes Steuerelement zu aktivieren, während das übergeordnete Steuerelement hatIsEnabled = false. Alle Antworten, die ich bis jetzt gefunden habe, besagen, dass es nicht möglich ist - man muss die übergeordneten und untergeordneten Steuerelemente aktivieren und deaktivieren, mit Ausnahme derjenigen, die noch aktiviert sein sollten.

Durch Überschreiben der Metadaten für IsEnabledProperty in der Datei App.xaml.cs konnte ich dieses Standardverhalten ändern:

protected override void OnStartup(StartupEventArgs e)
{
    UIElement.IsEnabledProperty.OverrideMetadata(typeof(FrameworkElement),
             new UIPropertyMetadata(true,IsEnabledChanged, CoerceIsEnabled));
}

private void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var childrenCount = VisualTreeHelper.GetChildrenCount(d);
    for (int i = 0; i < childrenCount; ++i)
    {
        var child = VisualTreeHelper.GetChild(d, i);
        child.CoerceValue(UIElement.IsEnabledProperty);
    }
}
private object CoerceIsEnabled(DependencyObject d, object basevalue)
{
    var parent = VisualTreeHelper.GetParent(d) as FrameworkElement;
    if (parent != null && parent.IsEnabled == false)
    {
        if (d.ReadLocalValue(UIElement.IsEnabledProperty) == DependencyProperty.UnsetValue)
        {
            return false;
        }
    }
    return basevalue;
}

Jetzt können Sie die manuell einstellenIsEnabled Eigenschaft für ein untergeordnetes Element, die den übergeordneten Wert überschreibt.

Gibt es Nachteile dieses Ansatzes?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage