DependencyProperty.AddOwner
От: Visor2004  
Дата: 18.12.10 21:28
Оценка:
Объясните плз на пальцах для чего нужен сабж? Что делает этот метод? Никак не могу толком вкурить описание из msdn. А за несколько лет использования wpf, как-то он мне ни разу не понадобился
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: DependencyProperty.AddOwner
От: MxMsk Португалия  
Дата: 18.12.10 21:51
Оценка: +2
Здравствуйте, Visor2004, Вы писали:

V>Объясните плз на пальцах для чего нужен сабж? Что делает этот метод? Никак не могу толком вкурить описание из msdn. А за несколько лет использования wpf, как-то он мне ни разу не понадобился

Чтобы не плодить одинаковых свойств зависимостей. При вызове AddOwner не создается нового DependencyProperty, а только добавляются отдельные метаданные. Плюс, не нужно повторно описывать строковое наименование и тип значения.
Re: DependencyProperty.AddOwner
От: notacat  
Дата: 18.12.10 22:46
Оценка:
можно в свой класс добавить CoerceValueCallback, PropertyChangedCallback, дефолтное значение поменять.
Re[2]: DependencyProperty.AddOwner
От: Visor2004  
Дата: 19.12.10 11:57
Оценка:
Здравствуйте, notacat, Вы писали:

N>можно в свой класс добавить CoerceValueCallback, PropertyChangedCallback, дефолтное значение поменять.

Для этого служит OverrideMetadata метод, разве нет?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: DependencyProperty.AddOwner
От: Visor2004  
Дата: 19.12.10 12:01
Оценка:
Здравствуйте, 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, так?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: DependencyProperty.AddOwner
От: Sinix  
Дата: 19.12.10 12:35
Оценка:
Здравствуйте, 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.


Подробнее —
http://stackoverflow.com/questions/227030/is-it-acceptable-to-borrow-dependency-properties-from-unrelated-classes
http://msdn.microsoft.com/en-us/library/ms597484.aspx
http://msdn.microsoft.com/en-us/library/ms751554.aspx
Re[3]: DependencyProperty.AddOwner
От: MxMsk Португалия  
Дата: 19.12.10 17:19
Оценка:
Здравствуйте, Visor2004, Вы писали:

N>>можно в свой класс добавить CoerceValueCallback, PropertyChangedCallback, дефолтное значение поменять.

V>Для этого служит OverrideMetadata метод, разве нет?
OverrideMetadata работает только в наследниках или для Attached Properties.
Re[3]: DependencyProperty.AddOwner
От: notacat  
Дата: 19.12.10 17:36
Оценка: 8 (1)
да, похоже, что основных идеи две:
1. не создавать нового DependencyProperty, чтобы получить поведение, аналогичное поведению других классов.
Посмотрела рефлектором — по всей видимости MS их использует, когда одинаковые по смыслу вещи должны присутствовать в разных ветках наследования. Всякие общие вещи типа IsReadOnly, FontXXX, Background, Foreground... Наверное, если это все регистрировать по-отдельности, производительность может пострадать.
2. "наследуемые" свойства (например, когда надо, чтобы шрифты от контейнера наследовались дочерними элементами).

Вот хорошее обсуждение (по крайней мере авторы ответов должны наверняка знать, о чем говорят):
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b0f689f3-a6c1-4454-a573-dd44f993088c/
Re[4]: DependencyProperty.AddOwner
От: Visor2004  
Дата: 19.12.10 20:50
Оценка:
Здравствуйте, 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 свойств
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[5]: DependencyProperty.AddOwner
От: notacat  
Дата: 19.12.10 21:11
Оценка:
V>Разве для наследования значения надо вызывать AddOwner?

Не проверяла. В MSDN пишут, что чтобы AttachedProperty наследовалось от контейнера, ему надо в метаданных соотв. флаг поставить.

С AddOwner речь не об этом. Ну например: вы хотите какой-нибудь свой элемент использовать в каком-нибудь контроле. В классе Control есть свойство FontStyle, а вы свой элемент наследуете от FrameworkElement, в котором такого свойства нет. Вот чтобы наследование FontStyle от контейнера к вашему элементу сработало — нужно не новое свойство FontStyle регистрировать, а через AddOwner. Вроде логично, если это одно и то же свойство со многими хозяевами — оно будет наследоваться, а если это просто разные свойства с одним названием — не будет.
Re[6]: DependencyProperty.AddOwner
От: Visor2004  
Дата: 19.12.10 21:15
Оценка:
Здравствуйте, notacat, Вы писали:

V>>Разве для наследования значения надо вызывать AddOwner?


N>Не проверяла. В MSDN пишут, что чтобы AttachedProperty наследовалось от контейнера, ему надо в метаданных соотв. флаг поставить.


N>С AddOwner речь не об этом. Ну например: вы хотите какой-нибудь свой элемент использовать в каком-нибудь контроле. В классе Control есть свойство FontStyle, а вы свой элемент наследуете от FrameworkElement, в котором такого свойства нет. Вот чтобы наследование FontStyle от контейнера к вашему элементу сработало — нужно не новое свойство FontStyle регистрировать, а через AddOwner. Вроде логично, если это одно и то же свойство со многими хозяевами — оно будет наследоваться, а если это просто разные свойства с одним названием — не будет.


вообщем, подытожив, можно сказать, что нужно это таки для наследования значений.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[7]: DependencyProperty.AddOwner
От: notacat  
Дата: 19.12.10 21:23
Оценка: 1 (1)
V>вообщем, подытожив, можно сказать, что нужно это таки для наследования значений.
Ну почему, например BackgroundProperty не наследуется, а тем не менее в большинстве случаев его через AddOwner используют
Re[8]: DependencyProperty.AddOwner
От: Visor2004  
Дата: 19.12.10 21:40
Оценка:
Здравствуйте, notacat, Вы писали:

V>>вообщем, подытожив, можно сказать, что нужно это таки для наследования значений.

N>Ну почему, например BackgroundProperty не наследуется, а тем не менее в большинстве случаев его через AddOwner используют

ну, основная фича — это все-таки наследование. В слюбом случае спасибо за объяснения
Помните!!! ваш говнокод кому-то предстоит разгребать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.