如何获取依赖项属性的名称

时间:2013-07-31 15:27:03

标签: c# silverlight dependency-properties

出于绑定目的,我们有一个方法,它返回传入的框架元素的最常见依赖属性。如果我们传入TextBlock,此方法返回TextBlock.TextProperty; RadMaskedTextBox会返回RadMaskedTextBox.MaskedTextProperty,依此类推。

在调试时,如果键入dp.Name,我会分别得到“Text”,“MaskedText”。但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
};

我无法弄清楚如何从依赖属性中获取“Text”或“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);
}

但是,当我调用nameField.GetValue(dp)时,我得到了FieldAccessViolation。我可以在手表中看到它,但实际上无法实现它。我希望有人能解释一下,因为我不明白为什么我不能得到/使用这个值。特别是当它(字符串“MaskedText”)是必须为路径提供的。 UGH !!!

但非常感谢你的帮助! JD

1 个答案:

答案 0 :(得分:0)

我不是百分之百确定在没有进一步澄清的情况下发生了什么...但是做出一些假设应该可以通过反思获得名称......

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
};