我需要确定窗口上的控件是否声明了特定的依赖项属性。以下是带有DP DemandRole的按钮示例。可以为各种控件类型声明DP,而不仅仅是按钮。我试图枚举窗口上的所有控件,只返回那些声明了DP DemandRole的控件。
<Button x:Name="_reset"
sec:SecurityAction.DemandRole="Admin,Engineer,SuperUser,Technician,Supervisor"
Content="_Reset"
Visibility="Visible"
Command="{Binding ResetPasswordCommand}" />
我可以获取特定类型的依赖项属性,但只返回该类型的属性,并且包含我为控件定义的DP。
static IEnumerable<FieldInfo> GetDependencyProperties(Type type)
{
var dependencyProperties = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
.Where(p => p.FieldType.Equals(typeof(DependencyProperty)));
return dependencyProperties;
}
知道如何在控件的特定实例上获取所有DP吗?
谢谢,
兰斯
答案 0 :(得分:2)
我在Visual Studio论坛的Getting list of all dependency/attached properties of an Object页面上找到了这个代码示例。我无法保证它能够正常工作,但它会出现在&#39;帮助了原来的问题作者。
public static class DependencyObjectHelper
{
public static List<DependencyProperty> GetDependencyProperties(Object element)
{
List<DependencyProperty> properties = new List<DependencyProperty>();
MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
if (markupObject != null)
{
foreach (MarkupProperty mp in markupObject.Properties)
{
if (mp.DependencyProperty != null)
{
properties.Add(mp.DependencyProperty);
}
}
}
return properties;
}
public static List<DependencyProperty> GetAttachedProperties(Object element)
{
List<DependencyProperty> attachedProperties = new List<DependencyProperty>();
MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
if (markupObject != null)
{
foreach (MarkupProperty mp in markupObject.Properties)
{
if (mp.IsAttached)
{
attachedProperties.Add(mp.DependencyProperty);
}
}
}
return attachedProperties;
}
}
如果这些扩展方法没有帮助,链接页面上还有其他示例。
更新&gt;&gt;&gt;
我刚刚在Stack Overflow上找到了这个问题,这也可能会有所帮助:
答案 1 :(得分:1)
未经测试,但我猜你需要BindingFlags.FlattenHierarchy标志。
static IEnumerable<FieldInfo> GetDependencyProperties(Type type)
{
var dependencyProperties = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(p => p.FieldType.Equals(typeof(DependencyProperty)));
return dependencyProperties;
}
如果这不起作用,则需要递归调用type.BaseType.GetFields
,直到BaseType
返回null
并连接所有字段。