Объясните плз на пальцах для чего нужен сабж? Что делает этот метод? Никак не могу толком вкурить описание из msdn. А за несколько лет использования wpf, как-то он мне ни разу не понадобился
Здравствуйте, Visor2004, Вы писали:
V>Объясните плз на пальцах для чего нужен сабж? Что делает этот метод? Никак не могу толком вкурить описание из msdn. А за несколько лет использования wpf, как-то он мне ни разу не понадобился
Чтобы не плодить одинаковых свойств зависимостей. При вызове AddOwner не создается нового DependencyProperty, а только добавляются отдельные метаданные. Плюс, не нужно повторно описывать строковое наименование и тип значения.
Здравствуйте, notacat, Вы писали:
N>можно в свой класс добавить CoerceValueCallback, PropertyChangedCallback, дефолтное значение поменять.
Для этого служит OverrideMetadata метод, разве нет?
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Visor2004, Вы писали:
V>>Объясните плз на пальцах для чего нужен сабж? Что делает этот метод? Никак не могу толком вкурить описание из msdn. А за несколько лет использования wpf, как-то он мне ни разу не понадобился MM>Чтобы не плодить одинаковых свойств зависимостей. При вызове AddOwner не создается нового DependencyProperty, а только добавляются отдельные метаданные. Плюс, не нужно повторно описывать строковое наименование и тип значения.
Т.е. если я напишу так:
class Test : DependencyObject
{
static Test()
{
var property = TextBlock.TextProperty.AddOwner(typeof(Test));
}
}
То у меня в классе Test появится такое же свойство Text как и в TextBlock? и обращаться к нему можно будет только через GetValue(TextBlock.TextProperty), но значения и метаданные будут свои. Т.е. это что-то вроде IClonable для DependencyProperty, так?
Здравствуйте, Visor2004, Вы писали:
V>То у меня в классе Test появится такое же свойство Text как и в TextBlock? и обращаться к нему можно будет только через GetValue(TextBlock.TextProperty), но значения и метаданные будут свои. Т.е. это что-то вроде IClonable для DependencyProperty, так?
The supplied metadata is merged with the property metadata for the dependency property as it exists on the base owner. Any characteristics that were specified in the original base metadata will persist. Only those characteristics that were specifically changed in the new metadata will override the characteristics of the base metadata
Если вы не указываете свои метаданные, будут использоваться оригинальные. Одно но:
When you call AddOwner, you must specify the FrameworkPropertyMetadataOptions.Inherits again.
Здравствуйте, Visor2004, Вы писали:
N>>можно в свой класс добавить CoerceValueCallback, PropertyChangedCallback, дефолтное значение поменять. V>Для этого служит OverrideMetadata метод, разве нет?
OverrideMetadata работает только в наследниках или для Attached Properties.
да, похоже, что основных идеи две:
1. не создавать нового DependencyProperty, чтобы получить поведение, аналогичное поведению других классов.
Посмотрела рефлектором — по всей видимости MS их использует, когда одинаковые по смыслу вещи должны присутствовать в разных ветках наследования. Всякие общие вещи типа IsReadOnly, FontXXX, Background, Foreground... Наверное, если это все регистрировать по-отдельности, производительность может пострадать.
2. "наследуемые" свойства (например, когда надо, чтобы шрифты от контейнера наследовались дочерними элементами).
Здравствуйте, notacat, Вы писали:
N>да, похоже, что основных идеи две: N>1. не создавать нового DependencyProperty, чтобы получить поведение, аналогичное поведению других классов. N>Посмотрела рефлектором — по всей видимости MS их использует, когда одинаковые по смыслу вещи должны присутствовать в разных ветках наследования. Всякие общие вещи типа IsReadOnly, FontXXX, Background, Foreground... Наверное, если это все регистрировать по-отдельности, производительность может пострадать. N>2. "наследуемые" свойства (например, когда надо, чтобы шрифты от контейнера наследовались дочерними элементами).
Разве для наследования значения надо вызывать AddOwner?
static class Test
{
private static readonly DependencyProperty TestProperty = DependencyProperty.RegisterAttached("Test", typeof(int), typeof(Test));
}
.....
<Border test:Test.Test="1">
<Button/>
</Border>
Если в приведенном выше коде, спросить у кнопки значение Test, то вернется 1. Т.е. для наследования значений не обязательно делать AddOwner, по крайней мере для Attached свойств
V>Разве для наследования значения надо вызывать AddOwner?
Не проверяла. В MSDN пишут, что чтобы AttachedProperty наследовалось от контейнера, ему надо в метаданных соотв. флаг поставить.
С AddOwner речь не об этом. Ну например: вы хотите какой-нибудь свой элемент использовать в каком-нибудь контроле. В классе Control есть свойство FontStyle, а вы свой элемент наследуете от FrameworkElement, в котором такого свойства нет. Вот чтобы наследование FontStyle от контейнера к вашему элементу сработало — нужно не новое свойство FontStyle регистрировать, а через AddOwner. Вроде логично, если это одно и то же свойство со многими хозяевами — оно будет наследоваться, а если это просто разные свойства с одним названием — не будет.
Здравствуйте, notacat, Вы писали:
V>>Разве для наследования значения надо вызывать AddOwner?
N>Не проверяла. В MSDN пишут, что чтобы AttachedProperty наследовалось от контейнера, ему надо в метаданных соотв. флаг поставить.
N>С AddOwner речь не об этом. Ну например: вы хотите какой-нибудь свой элемент использовать в каком-нибудь контроле. В классе Control есть свойство FontStyle, а вы свой элемент наследуете от FrameworkElement, в котором такого свойства нет. Вот чтобы наследование FontStyle от контейнера к вашему элементу сработало — нужно не новое свойство FontStyle регистрировать, а через AddOwner. Вроде логично, если это одно и то же свойство со многими хозяевами — оно будет наследоваться, а если это просто разные свойства с одним названием — не будет.
вообщем, подытожив, можно сказать, что нужно это таки для наследования значений.
V>вообщем, подытожив, можно сказать, что нужно это таки для наследования значений.
Ну почему, например BackgroundProperty не наследуется, а тем не менее в большинстве случаев его через AddOwner используют
Здравствуйте, notacat, Вы писали:
V>>вообщем, подытожив, можно сказать, что нужно это таки для наследования значений. N>Ну почему, например BackgroundProperty не наследуется, а тем не менее в большинстве случаев его через AddOwner используют
ну, основная фича — это все-таки наследование. В слюбом случае спасибо за объяснения