Substituição WPF IsEnabled do pai

Eu apenas procurei uma maneira de ativar um controle filho enquanto o controle paiIsEnabled = false. Todas as respostas que encontrei até agora dizem que isso não é possível - é preciso ativar o pai e desativar os controles filho, exceto os que ainda devem estar ativados.

No entanto, substituindo os metadados para IsEnabledProperty no arquivo App.xaml.cs, eu consegui alterar esse comportamento padrão:

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

Agora você pode definir manualmente oIsEnabled propriedade em um filho, que substitui o valor pai.

Existem desvantagens dessa abordagem?

questionAnswers(3)

yourAnswerToTheQuestion