У меня есть окно с 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 свойства?
Это важно знать по другой причине; поскольку система Binding напрямую использует свойство зависимостей, она никогда не будет называть getter и setter для стандартного свойства «дружественной оболочки», открытого в классе. Очень распространенная ошибка заключается в том, чтобы поместить некоторую специальную логику в setter для этого свойства оболочки, только чтобы обнаружить, что она не вызывается, когда значение обновляется системой Binding. –
@Clemens - свойство CLR недоступно, потому что поиск свойств выполняется путем привязки '- достаточно справедливо. Но, как упоминалось, привязка будет иметь доступ к базовому идентификатору свойства static DP, который я обозначил как private. Итак, как он будет доступен? –
@RohitVats Нет, привязка не будет доступна в вашем поле 'private static'. Он получит значение свойства непосредственно из системы свойств зависимостей. Прямой доступ к статическому полю не будет работать в любом случае, поскольку он является статическим и, следовательно, не связан ни с одним экземпляром вашего класса. – Clemens