我知道可以使用反射来访问给定类的所有依赖属性。但是是否可以使用反射或其他通用技术将所有依赖项属性设置回注册属性时指定的默认值?
示例 dp:
public static readonly DependencyProperty IdProperty = DependencyProperty.Register("Id", typeof(int?), typeof(OwnerClass), new PropertyMetadata(0));
public int? Id { get { return (int?)GetValue(IdProperty); } }
我可以循环遍历任何给定类中的所有此类 dps 并将它们设置回原始 PropertyMetadata 对象给定的值吗?
我的目的是尝试在抽象基类中为 wpf 应用程序中的所有 View 模型创建一个“Clear()”方法。我想给 Clear() 默认行为,将可能注册的所有 dps 设置回注册时给出的默认值。用户可以在需要时覆盖此行为。
最佳答案
它会是这样的:
使用一个简单的模型:
public class Employee
{
public string FirstName { get; set; }
public int Age { get; set; }
}
清除其属性的依赖对象
public class EmployeesDataGrid : DataGrid
{
public static readonly DependencyProperty EmployeesProperty =
DependencyProperty.Register("Employees", typeof(ObservableCollection<Employee>), typeof(EmployeesDataGrid), new PropertyMetadata(new ObservableCollection<Employee>()));
public ObservableCollection<Employee> Employees
{
get { return (ObservableCollection<Employee>)GetValue(EmployeesProperty); }
set { SetValue(EmployeesProperty, value); }
}
}
在xaml中使用它:
<local:EmployeesDataGrid x:Name="myGrid"/>
我将其填充在代码隐藏中(只是为了简单起见!),如下所示:
myGrid.Employees = new ObservableCollection<Employee>
{
new Employee { Age = 20, FirstName = "John"},
new Employee { Age = 30, FirstName = "Alex"}
};
在明确的方法中:
foreach (FieldInfo field in depedencyObjectType.GetFields(BindingFlags.Static | BindingFlags.Public))
{
if (field.FieldType == typeof (DependencyProperty))
{
var dp = field.GetValue(depedencyObject) as DependencyProperty;
depedencyObject.ClearValue(dp);
}
}
depedencyObject
是 myGrid
depedencyObjectType
是 depedencyObject.GetType()
如果您使用调试器查看 myGrid
上的 Employees
属性,它会显示 Count = 0
。
关于c# - 使用反射将所有依赖属性重置回默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894920/