DependencyProperty的DefaultValue何时通过PropertyMetadata定义获得它的值?

时间:2010-12-09 21:04:41

标签: silverlight dependency-properties

我有两个具有共同底层基础架构的项目。第一个是Silverlight 3,第二个是Silverlight 4。

我有一个ViewRegionControl,我在XAML中声明它来定义区域。 ViewRegionControl类负责管理可见的注册视图等。它有一个依赖属性,作为注册区域的注册表。

public static readonly DependencyProperty ViewRegionRegistryProperty = DependencyProperty.Register(
            "ViewRegionRegistry",
            typeof(IViewRegionRegistry),
            typeof(ViewRegionControl),
            new PropertyMetadata(IoC.TryResolve<IViewRegionRegistry>()));

public IViewRegionRegistry ViewRegionRegistry
{
     get { return (IViewRegionRegistry)GetValue(ViewRegionRegistryProperty); }
     set { SetValue(ViewRegionRegistryProperty, value); }
}

默认值作为从IoC容器实例化的对象传递。在这两种实现中,ViewRegionRegistry都不是由XAML设置的,只能通过这个位置。

预期的初始化在我的Silverlight 3项目中成功发生,但在我的Silverlight 4项目中没有成功。 Silverlight 4有什么变化?依赖属性是否在Silverlight 4中懒得获得它的默认值?

这里的目的是创建一个通过ViewRegionRegistry dp获得的Singleton引用。

检查http://msdn.microsoft.com/en-us/library/cc903949%28v=VS.95%29.aspx

虽然,我在另一个dp的回调中使用了一个dp,msdn清楚地说:

“避免这些问题的一种方法是确保回调仅使用其他依赖项属性,并且每个此类依赖项属性都具有已建立的默认值作为其注册元数据的一部分。”

我做到了。为什么版本之间的行为不同?

1 个答案:

答案 0 :(得分:0)

必须在类型的静态初始化发生时建立默认值。所以我怀疑问题是否真的在Silverlight 3和4之间改变了静态初始化的时间?

更改内容是在CLR 4上Silverlight 4执行代码基于。在3.5到4之间执行类型初始化程序时发生了更改。请参阅此文Type initialization changes in .NET 4.0 (由一些叫做Jon Skeet的家伙)。

您可能尝试的一件事是向您的类型添加一个空的静态构造函数,以查看是否有帮助: -

 public static ViewRegionControl() { }