如何创建自定义*只写*依赖属性?

2023-12-30

我需要知道创建只写依赖属性的过程是什么。我可以看到 DependencyProperty 类没有用于只写属性的特殊“Register”方法,但我不知道 RegisterAttached 方法是否适用于我想要执行的操作。

此属性需要是依赖属性,而不是简单的 CLR 属性。在内部,我的类需要对此属性进行 PropertyChangedCallback 以保持稳定。

我知道可以创建只写依赖属性,因为它在以下内容中表述得很清楚:
.
然而,这是我可以在同一页面上找到“依赖属性”和“只写”的唯一地方。这位作者显然认为没有必要向读者展示除基本读写依赖属性之外的任何内容的过程。当然,这本书可能是一堆废话——但这本书看起来相当标准,所以我认为作者是正确的。我认为互联网上信息的缺乏源于这样一个事实:通常没有人需要建造这样的房产。

我知道想要创建自己的只写依赖属性听起来很可疑。我向你保证这在我想要的地方是有意义的。我的类有一个属性,其值仅对设置它的对象有用。如果另一个对象稍后请求该属性的值,则在不知道设置器的原始上下文的情况下,它将无法从该值中获得任何理性意义。

该属性不用于提供信息。让外部对象尝试以这种方式使用属性值是有问题的、危险的和安全风险。所以我认为最好的设计是禁止对该属性的读取操作。任何使用我的类的人都会发现他们被迫按照预期的方式使用该类,这最终会变得更好、更干净。


你不能,这似乎是设计使然。虽然我可以理解您对上述书籍的处理方式,并且绝不质疑其质量,但我仍然认为这是某种复制粘贴或类似的问题。这是我的推理:

WPF属性系统代码

  • 正如您已经提到的公共 API依赖属性类 http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.aspx仅有功能注册只读() http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.registerreadonly.aspx and 注册附加只读() http://msdn.microsoft.com/en-us/library/ms597494.aspx.
  • 通过以下方式深入了解类内部反射器 http://www.red-gate.com/products/reflector/只揭示处理这些的专用代码只读依赖属性 http://msdn.microsoft.com/en-us/library/ms754044.aspx,看不到任何关于只写功能的信息。
  • 另一个选择可能是元数据,但两者都不是依赖属性元数据 http://msdn.microsoft.com/en-us/library/ms752375.aspx也不特别框架属性元数据 http://msdn.microsoft.com/en-us/library/ms751554.aspx借助于FrameworkPropertyMetadataOptions 枚举 http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadataoptions.aspx正在提供任何类似于只写的东西。

WPF属性系统设计

  • 更重要,'其 XAML 处理器的当前 WPF 实现本质上是依赖属性感知的。加载二进制 XAML 并处理依赖属性的属性时,WPF XAML 处理器使用依赖属性的属性系统方法。这有效地绕过了属性包装器。, see XAML 加载和依赖属性 http://msdn.microsoft.com/en-us/library/bb613563.aspx.
  • 最重要的,'依赖属性通常应被视为公共属性。 Windows Presentation Foundation (WPF) 属性系统的本质阻止了对依赖属性值进行安全保证的能力。, see 依赖财产安全 http://msdn.microsoft.com/en-us/library/ms752808.aspx.

特别是后两点概述了设计约束,依赖属性值始终可以通过获取值() http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.getvalue.aspx/设定值() http://msdn.microsoft.com/en-us/library/ms597473.aspx,无论它们的 CLR 包装器是访问受限还是可用,唯一的例外是专门考虑的只读依赖属性 http://msdn.microsoft.com/en-us/library/ms754044.aspx.

因此,作为Jeffs https://stackoverflow.com/questions/1315186/how-can-i-create-a-custom-write-only-dependency-property/1315209#1315209答案已经暗示,仅删除 getter 例如并不能真正阻止任何人通过以下方式访问该属性获取值() http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.getvalue.aspx,尽管这至少可以“减少自定义类立即暴露的命名空间”。任何此类语义解决方法的用处是使属性值的可见性/可访问性稍差,并且检索到的值对客户端来说本质上无用,如Jeff https://stackoverflow.com/questions/1315186/how-can-i-create-a-custom-write-only-dependency-property/1315209#1315209当然取决于您的具体情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建自定义*只写*依赖属性? 的相关文章

随机推荐