2013-07-31 3 views
1

Для целей привязки у нас есть метод, который возвращает наиболее распространенное свойство зависимостей для элемента структуры, который был передан. Если мы перейдем в 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

+0

Где вы напечатав 'dp.Name' во время отладки? Промежуточное окно в точке останова? –

+0

Что такое 'dp', где вы его инициализируете? – vorrtex

+0

Инициализируется от вызова нашего метода: var dp = ControlPropertyResolver.Resolve (typeof (TextBlock)); // возвращает свойство dependencyProperty TextProperty. В точке останова после вызова я могу ввести dp.Name в окне Watch и получить значение «Текст» – user2638417

ответ

0

Я не 100% уверен, что происходит без дальнейших разъяснений ... Но сделать некоторые предположения, должно быть возможным, чтобы получить имя с помощью отражения ...

var typeOfDp = dp.GetType(); 
var nameProperty = typeOfDp 
        .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        .Single(t => t.Name == "Name"); 
var name = nameProperty.GetValue(dp); 
var binding = new Binding(name) //Maybe it will work? 
{ 
    Source = frameworkElement 
}; 
+0

Я попробовал, и это было близко. Я обновил свой оригинальный комментарий тем, что я пробовал, и результатом. Спасибо!!!! JD – user2638417

+0

У вас возникла проблема с разрешениями разрешений. Http://msdn.microsoft.com/en-us/library/stfy7tfc.aspx – Kevin

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