Как сделать IsEnabled наследуемым - PullRequest
1 голос
/ 15 октября 2019

Свойства зависимостей могут быть унаследованы (см. 10-ю точку здесь ), что является хорошей особенностью:

<Grid TextBlock.FontSize="100">
... any TextBlock inside will inherit this value
</Grid>

Чтобы сделать это возможным TextBlock необходимо использовать AddOwner() для прикрепленного свойства TextElement.FontSize . Подойдет любое прикрепленное свойство (TextBlock или TextElement).

Я хочу добиться чего-то вроде:

<Grid local:MyControl.IsEnabled="False">
... somewhere inside MyControl will get disabled
</Grid>

И я не уверен, как этого добиться, потому что IsEnabled неприсоединенное свойство (означает, что я не могу использовать вышеуказанный синтаксис), и я не хочу отключать все элементы UIE .

Как правильно это сделать? Нужно ли создавать новое присоединенное свойство и при его изменении обратного вызова IsEnabled или существует что-то более удобное?

1 Ответ

1 голос
/ 15 октября 2019

Это было проще, чем я думал, я должен добавить прикрепленное свойство к 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...