Подтвердить что ты не робот

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

Как изменить значение по умолчанию для унаследованного свойства зависимостей? В нашем случае мы создали подкласс 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
    );

}

Марк

UPDATE...

Я думаю, что это еще лучше, поскольку оно устраняет "новый" вызов. Вы по-прежнему получаете доступ к нему через 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
    );

}
4b9b3361

Ответ 1

Правильный способ переопределить свойство базового класса:

static TestControl() {

    FooProperty.OverrideMetadata(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67)
    );
}

EDIT:

AddOwner предназначен для совместного использования одного и того же DependencyProperty между типами, которые не связаны (т.е. TextProperty от TextBox и TextBlock).