【问题标题】:Dependency Property has a value set upon control construction依赖属性具有在控件构造时设置的值
【发布时间】:2023-03-28 07:44:01
【问题描述】:

我们在 WinRT XAML 中。

我有一个自定义控件B,其依赖属性为Items,该控件位于另一个控件的模板中。依赖属性使用PropertMetadata 类型初始化为一个新的空集合。它永远不会绑定数据 - 请记住这一点。

当我进入页面时,该控件被实例化为另一个自定义控件A 的模板的一部分。从B 的构造函数中的断点开始,当我检查Items 的值时,它包含0 个项目。

作为其他活动的一部分,控制A '手动' 调用B.Items.Add() 以插入数据。没有数据绑定。

当我向后导航然后单击以再次导航到页面时,构造函数再次被触发,但这次Items 仍然具有A 添加的值。它保留了它的价值。

因此,即使控件被卸载和加载(我可以看到事件),控件和依赖属性也不会重新初始化。

这对吗?

【问题讨论】:

    标签: c# xaml windows-runtime winrt-xaml


    【解决方案1】:

    依赖属性在您的类B 中声明为静态字段。它仅初始化一次,因此属性元数据中的新集合仅初始化一次,然后由属性的所有“实例”共享。这是依赖属性声明中的常见错误。

    您应该在类B 的构造函数中将依赖属性值设置为一个新的空集合,而不是通过属性元数据提供默认值。

    【讨论】:

    • 感谢您的回答,但我认为它不正确。属性元数据应应用于“新实例”。 “为依赖属性提供的最常见的元数据是为它们提供一个默认值,该值应用于使用该属性的新实例。” - MSDN。老实说,我闻到了虫子的味道。这个感觉有点不对劲。
    • 这绝对不是一个错误,并且已经在 SO 上讨论过几次。属性元数据提供的默认值只是分配给控件的每个新实例中的属性。您可以通过同时创建自定义控件的两个实例并检查Items 值来简单地对此进行测试。它将是同一个集合对象,即您作为默认值提供的那个。
    • 知道了,你是对的。 thomasclaudiushuber.com/blog/2010/02/11/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2015-02-03
    • 2014-10-09
    • 2011-05-25
    相关资源
    最近更新 更多