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?