Для целей привязки у нас есть метод, который возвращает наиболее распространенное свойство зависимостей для элемента структуры, который был передан. Если мы перейдем в TextBlock
, этот метод возвращает TextBlock.TextProperty
; RadMaskedTextBox
возвращает RadMaskedTextBox.MaskedTextProperty
и т. Д.Как получить имя свойства зависимостей
При отладке, если тип dp.Name
, я получаю «Текст», «Маскированный текст» соответственно. Но dp.Name
недоступен в коде.
Я пытаюсь сделать динамическое связывание с подсказкой:
var binding = new Binding("Text") //Works
{
Source = frameworkElement
};
var binding = new Binding("MaskedText") //Works
{
Source = frameworkElement
};
var binding = new Binding(dp.Name) //Doesn't work
{
Source = frameworkElement
};
Я не могу понять, как получить «Текст» или «MaskedText» из свойства зависимостей, и я не понимаю, почему это спрятаны для начала.
.Net Framework 4.5/Silverlight 5
Спасибо за любую помощь или прозрения вы можете дать !! JD
Кевин, Большое вам спасибо, вы были очень близки. Это не публичное поле, так что я сделал это:
{
var dpType = dp.GetType();
var nameField = dpType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Single(pi => pi.Name == "Name");
var name = nameField.GetValue(dp);
}
Однако я получаю FieldAccessViolation, когда я называю nameField.GetValue (дп). Я вижу это в часах, но на самом деле не могу добраться до него. Хотелось бы, чтобы кто-то объяснил это, потому что я не понимаю, почему я не могу получить/использовать это значение. Особенно, когда это (строка «MaskedText») является тем, что должно быть предоставлено для пути. UGH !!!
Благодарю вас за помощь! JD
Где вы напечатав 'dp.Name' во время отладки? Промежуточное окно в точке останова? –
Что такое 'dp', где вы его инициализируете? – vorrtex
Инициализируется от вызова нашего метода: var dp = ControlPropertyResolver.Resolve (typeof (TextBlock)); // возвращает свойство dependencyProperty TextProperty. В точке останова после вызова я могу ввести dp.Name в окне Watch и получить значение «Текст» – user2638417