2013-08-20 3 views
2

У меня есть окно с DataContext установить себе этот простой XAML макет -Связывание с частной Dependency собственности работает по-другому по сравнению с частной CLR собственности

<StackPanel> 
    <TextBlock Text="{Binding NameCLR}"/> 
    <TextBlock Text="{Binding NameDP}"/> 
</StackPanel> 

и в коде позади меня есть два свойства NameCLR - CLR property и NameDP - Dependency Property.

private string NameCLR 
    { 
     get { return "CLRProperty"; } 
    } 

    private string NameDP 
    { 
     get { return (string)GetValue(NameDPProperty); } 
     set { SetValue(NameDPProperty, value); } 
    } 

    private static readonly DependencyProperty NameDPProperty = 
     DependencyProperty.Register("NameDP", typeof(string), typeof(MainWindow), 
             new UIPropertyMetadata("DPProperty")); 

Поскольку код-код является частичным определением класса, а частичным является XAML. Итак, я предполагал, что частная собственность должна быть видна XAML. Но, к моему удивлению, CLR и DP ведут себя по-разному.

Частная собственность Зависимости доступна, но частная собственность CLR нет.

я получил результат, как -

DPProperty 

вместо

CLRProperty 
DPProperty 

Может кто-то дайте мне знать об этом различное поведение в DP и CLR свойства?

ответ

5

Связанное свойство доступно Связыванием, а не объявляющим классом. Частное свойство CLR, например NameCLR, недоступно, поэтому привязка не будет работать.

Однако при разрешении пути свойства NameDP Связывание, по-видимому, обходит оболочку CLR для этого свойства и напрямую обращается к базовому свойству зависимостей, которое было зарегистрировано в системе свойств зависимостей, вызвав DependencyProperty.Register. Не имеет значения, присвоили ли вы возвращенную ссылку DependencyProperty частному или публичному статическому полю в своем классе. Свойство зависимостей было зарегистрировано для вашего класса, поэтому его можно найти.

Из ссылки here -

Зависимость свойств на данном типе доступны в качестве хранилища таблицы через систему собственности, реализация WPF его процессора XAML использует эту таблицу и делает вывод, что любое данное свойство ABC может быть более эффективным, вызывая SetValue в содержащем производном типе DependencyObject, используя свойство зависимостей идентификатор ABCProperty.

+2

Это важно знать по другой причине; поскольку система Binding напрямую использует свойство зависимостей, она никогда не будет называть getter и setter для стандартного свойства «дружественной оболочки», открытого в классе. Очень распространенная ошибка заключается в том, чтобы поместить некоторую специальную логику в setter для этого свойства оболочки, только чтобы обнаружить, что она не вызывается, когда значение обновляется системой Binding. –

+1

@Clemens - свойство CLR недоступно, потому что поиск свойств выполняется путем привязки '- достаточно справедливо. Но, как упоминалось, привязка будет иметь доступ к базовому идентификатору свойства static DP, который я обозначил как private. Итак, как он будет доступен? –

+1

@RohitVats Нет, привязка не будет доступна в вашем поле 'private static'. Он получит значение свойства непосредственно из системы свойств зависимостей. Прямой доступ к статическому полю не будет работать в любом случае, поскольку он является статическим и, следовательно, не связан ни с одним экземпляром вашего класса. – Clemens

Смежные вопросы