【问题标题】:Why declare DependencyProperty members public not protected?为什么将 DependencyProperty 成员声明为 public 不受保护?
【发布时间】:2011-10-19 08:28:07
【问题描述】:

为什么要以这种方式创建 DependencyProperty 成员:

public static readonly DependencyProperty DepProperty = DependencyProperty.Register(...);

而不是那样:

protected static readonly DependencyProperty DepProp = DependencyProperty.Register(...);

当我们拥有 CLR“包装器”时,为什么我们需要从外部使用 DevProp 成员:

public bool Dep
{
    get { return (bool)GetValue(DepProperty); }
    set { SetValue(DepProperty, value); }
}

【问题讨论】:

  • 除了给定的答案之外,请记住,在某些情况下您确实需要访问 DP 本身。例如。 public static readonly DependencyProperty Prop = Owner.Prop.AddOwner(typeof(thisClass), new FrameworkPropertyMetadata(Owner.Prop.DefaultMetadata.DefaultValue)); 此外,包装器只是一种帮助器,用于 XAML

标签: wpf dependency-properties


【解决方案1】:

According to MSDN,限制性访问修饰符实际上并不提供来自某些 API 的预期访问保护,因此除了 public 之外,没有必要声明依赖属性及其标识符字段:

依赖属性安全注意事项

依赖属性应该被声明为公共属性。依赖属性标识符字段应声明为公共静态字段。即使您尝试声明其他访问级别(例如受保护),也始终可以通过标识符结合属性系统 API 来访问依赖项属性。由于作为属性系统一部分的元数据报告或值确定 API,即使是受保护的标识符字段也可能是可访问的,例如 LocalValueEnumerator。如需更多信息,请参阅Dependency Property Security

无论如何,将他们暴露为public 并没有什么害处,我会收集。

【讨论】:

    【解决方案2】:

    依赖属性通常应被视为公共属性,任何有权访问实例的调用者都可以访问或至少可以发现。

    我认为“依赖属性安全注意事项”部分 " 在下面的链接中可以帮助您了解为什么以这种方式实现/注册依赖属性以及更多关于此的内容:

    http://msdn.microsoft.com/en-us/library/ms753358.aspx

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2015-06-14
      • 2013-03-05
      • 2018-02-11
      • 2011-04-09
      相关资源
      最近更新 更多