使用反射将所有依赖项属性重置回其默认值

本文关键字:属性 默认值 依赖 反射 | 更新日期: 2023-09-27 18:32:03

我知道可以使用反射来访问给定类上的所有依赖项属性。但是,是否可以使用反射或其他一些通用技术将所有依赖项属性设置回注册属性时给出的默认值?

示例 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 应用程序中的所有视图模型创建一个"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

depedencyObjectTypedepedencyObject.GetType()

如果使用调试器查看 Employees 属性myGrid,则会显示Count = 0