Правильное использование свойства зависимости

у меня есть элемент управления wpf, который я разрабатываю.

этот элемент управления содержит и инкапсулирует другой элемент управления.

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

какие-либо предложения?


person Chen Kinnrot    schedule 03.09.2009    source источник
comment
никаких ошибок, это просто не работает... я должен определить метаданные для обоих свойств.   -  person Chen Kinnrot    schedule 12.09.2009


Ответы (2)


Как внутренний, так и внешний элементы управления должны определять свойства зависимостей. Шаблон для внешнего элемента управления должен включать внутренний элемент управления и связывать свойства вместе:

<local:InnerControl SomePropertyOnInnerControl="{TemplateBinding SomePropertyOnOuterControl}"/>

Это гарантирует, что оба элемента управления можно использовать независимо друг от друга и они не связаны друг с другом. Свойства могут быть названы в соответствии с их использованием в этом элементе управления. Например, внутренний элемент управления может называть его чем-то вроде Text, в то время как внешний элемент управления использует его для более конкретной цели, например CustomerName.

person Kent Boogaart    schedule 03.09.2009
comment
Это правильный подход; прокси-свойство не является DependencyProperty и не даст вам надлежащего поведения привязки. - person AndyM; 03.09.2009

Обновления свойств зависимостей обрабатываются с помощью метаданных свойства, которые определяются как часть вашего свойства DependencyProperty. (Его также можно добавить к существующим DP, но это уже другая тема.)

Определите свой DependencyProperty с метаданными:

public static readonly DependencyProperty MyValueProperty =
    DependencyProperty.Register("MyValue", typeof(object), typeof(MyControl), 
    new UIPropertyMetadata(null, new PropertyChangedCallback(MyValue_PropertyChanged)));

Затем реализуйте обратный вызов:

private static void MyValue_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl c = (MyControl)d;
    c.DoSomething();
}
person AndyM    schedule 03.09.2009