代码之家  ›  专栏  ›  技术社区  ›  Price Jones

使用反射将所有依赖项财产重置回默认值?

  •  1
  • Price Jones  · 技术社区  · 12 年前

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

    示例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设置回注册时给定的默认值。如果需要,用户可以覆盖此行为。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Omri Btian    12 年前

    它应该是这样的:

    使用一个简单的模型:

    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()

    如果要使用调试器查看 Employees 上的属性 我的网格 它显示 Count = 0 .