Как я могу изменить значение по умолчанию унаследованного свойства зависимостей?

Как я могу изменить значение по умолчанию для унаследованного свойства зависимости? В нашем случае мы создали подкласс Control, для которого по умолчанию Focusable установлено значение «true». Мы хотим, чтобы для нашего подкласса по умолчанию было установлено значение false.

Что мы? Я просто установил для него значение false в конструкторе, но если кто-то использует ClearValue, он возвращается к значению по умолчанию, а не к значению, установленному в конструкторе.

Вот что я сейчас делаю для достижения этой цели ( Это тестовый элемент управления с DP, например, Foo.) Я не поклонник «нового», чтобы скрыть свойство, хотя благодаря AddOwner он указывает на тот же общий ресурс. экземпляр, так что я думаю, это нормально. Похоже, он наследует и все другие значения метаданных, так что это хорошо. Просто интересно, правильно ли это?

public class TestControlBase : Control
{

    public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
        "Foo",
        typeof(int),
        typeof(TestControlBase),
        new FrameworkPropertyMetadata(4) // Original default value
    );

    public int Foo
    {
        get { return (int)GetValue(FooProperty); }
        set { SetValue(FooProperty, value); }
    }

}

public class TestControl : TestControlBase
{

    public static readonly new DependencyProperty FooProperty = TestControlBase.FooProperty.AddOwner(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67) // New default for this subclass
    );

}

Марк

ОБНОВЛЕНИЕ ...

Я думаю, что это даже лучше, поскольку оно устраняет «новый» вызов. Вы по-прежнему получаете доступ к нему через FooProperty в базовом классе, поскольку он использует AddOwner . Таким образом, технически он один и тот же.

public class TestControl : TestControlBase
{
    // Note this is private
    private static readonly DependencyProperty AltFooProperty = TestControlBase.FooProperty.AddOwner(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67) // New default for this subclass
    );

}
23
задан Dave Clemmer 31 October 2013 в 16:42
поделиться