Как я могу изменить значение по умолчанию унаследованного свойства зависимости? - PullRequest
23 голосов
/ 13 апреля 2011

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

Мы просто устанавливали значение «false» в конструкторе, но если кто-то использует ClearValue, он возвращается к значению по умолчанию,не значение, установленное в конструкторе.

Вот что я сейчас делаю для достижения этого (например, это тестовый элемент управления с DP 'Foo'). Я не фанат'new' скрывает свойство, хотя благодаря 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
    );

}

1 Ответ

40 голосов
/ 13 апреля 2011

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

static TestControl() {

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

РЕДАКТИРОВАТЬ:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...