C# 如何获取依赖项属性的名称
出于绑定目的,我们有一个方法返回传入的框架元素的最常见的依赖项属性。如果传入TextBlock,该方法返回TextBlock.TextProperty;RadMaskedTextBox返回RadMaskedTextBox.MaskedTextProperty,依此类推 调试时,如果键入dp.Name,我将分别得到Text和MaskedText。但是dp.Name在代码中不可用 我正在尝试对工具提示进行动态绑定:C# 如何获取依赖项属性的名称,c#,silverlight,dependency-properties,C#,Silverlight,Dependency Properties,出于绑定目的,我们有一个方法返回传入的框架元素的最常见的依赖项属性。如果传入TextBlock,该方法返回TextBlock.TextProperty;RadMaskedTextBox返回RadMaskedTextBox.MaskedTextProperty,依此类推 调试时,如果键入dp.Name,我将分别得到Text和MaskedText。但是dp.Name在代码中不可用 我正在尝试对工具提示进行动态绑定: var binding = new Binding("Text") //Works
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
};
我不知道如何从dependency属性中获取文本或MaskedText,也不明白它为什么一开始是隐藏的
.Net Framework 4.5/Silverlight 5
感谢您提供的任何帮助或见解!!
法学博士
凯文,非常感谢你,你很接近。这是一个非公共领域,所以我做了以下工作:
{
var dpType = dp.GetType();
var nameField = dpType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Single(pi => pi.Name == "Name");
var name = nameField.GetValue(dp);
}
但是,当调用nameField.GetValuedp时,我会遇到FieldAccessViolation。我可以在手表上看到它,但实际上无法找到它。我希望有人能解释一下,因为我不明白为什么我不能获得/使用这个值。特别是当必须为路径提供字符串MaskedText时。啊
但是非常感谢你的帮助!
JD如果没有进一步的澄清,我不能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
};
调试期间,您在哪里键入dp.Name?断点处的中间窗口?什么是dp,在哪里初始化它?它是通过调用我们的方法初始化的:var dp=ControlPropertyResolver.ResolvetypeofTextBlock//返回dependencyProperty TextProperty。在调用后的断点处,我可以在“监视”窗口中键入dp.Name,并在您说//不工作时获取一个text值。。。是否未编译或.Name属性的值不正确?编写代码时,dp没有属性,只有几个方法;因此dp.Name将不会编译。但是当我到达一个断点并将dp添加到手表上时;Name返回我需要的文本。这很奇怪。从属财产上的名称是非公共财产,我只是不明白为什么。我确实尝试过,而且很接近。我用我的尝试和结果更新了我的原始评论。非常感谢。JDI您遇到了反射权限问题。。