Это было проще, чем я думал, я должен добавить прикрепленное свойство к MyControl
с FrameworkPropertyMetadataOptions.Inherits
, а остальное делает WPF.
MyControl
должно выглядеть так:
public class MyControl : Grid
{
public static bool GetDisabled(DependencyObject obj) => (bool)obj.GetValue(DisabledProperty);
public static void SetDisabled(DependencyObject obj, bool value) => obj.SetValue(DisabledProperty, value);
public static readonly DependencyProperty DisabledProperty =
DependencyProperty.RegisterAttached("Disabled", typeof(bool), typeof(MyControl),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits,
(d, e) =>
{
if (d is MyControl control)
control.IsEnabled = !(bool)e.NewValue;
}));
}
Обратный вызов повышается несколько раз, поэтому я должен проверить, установлен ли он прямо на MyControl
, и просто установить IsEnabled
там. Он работает для всех сценариев: добавление дочернего элемента, изменение значения для родителя и т. Д.
Использование в точности соответствует желаемому:
<Grid local:MyControl.Disabled="True">
<local:MyControl/>
</Grid>