WPF переопределить IsEnabled из родительского

Я просто искал способ включить дочерний элемент управления, в то время как родительский элемент управления имеетIsEnabled = false, Все ответы, которые я нашел до сих пор, говорят, что это невозможно - нужно включить родительский элемент и отключить дочерние элементы управления, кроме тех, которые все еще должны быть включены.

Однако, переопределив метаданные для IsEnabledProperty в файле App.xaml.cs, я смог изменить это поведение по умолчанию:

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

Теперь вы можете вручную установитьIsEnabled свойство на дочернем элементе, которое переопределяет родительское значение.

Есть ли недостатки этого подхода?

Ответы на вопрос(3)

Ваш ответ на вопрос