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

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(使用前将#替换为@)

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

  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 获取低阶 N 位

    有什么方法可以获得任何整数的低阶n位 其中n可以是 1 到 32 之间的任意数字 无需预先计算 32 个位掩码 每个订单一个 并使用 操作员 我也不想使用 具有 2 的幂 只是按位运算 Edit 例如 假设用户输入一个整数Num和另一个整数
  • 如何使用 XmlSerializer 在大文档中插入节点

    我有一个很大的 XML 文档 我想使用XmlSerializer类来插入新元素 其内容来自使用 xsd exe 生成的 NET 类实例 这是问题的后续如何使用 XmlSerializer 反序列化大型文档中的节点 https stackov
  • 如何衡量字符串的复杂度?

    我有一些长字符串 1 000 000 个字符 每个字符串仅包含定义字母表中的符号 例如 A 1 2 3 示例字符串 string S1 1111111111 meta complexity 0 string S2 1111222333 me
  • 依赖注入:没有为此对象定义无参数构造函数

    我正在尝试使用依赖项注入 NET Framework 4 6 ASP NET MVC 但收到错误 No parameterless constructor defined for this object 如果我还提供一个无参数构造函数Hom
  • 使用另一个 MEF 程序集中的类而不引用它

    我有 2 个 MEF 组件 设其为A成分和B成分 我需要的是能够从组件 A 中的组件 B 访问一个类 而不需要引用它 然后我想手动实例化该类的对象 目前我看到 MEF 允许使用 Import 自动实例化对象 它使用需要引用的接口 我可以使用
  • 在实体框架 6 中使用 SqlQuery>

    我正在尝试在 EF 6 中执行 SQL 查询 select查询返回两个字符串列 例如select a b 并且可以有任意数量的行 我想将结果映射到字典 但我无法摆脱以下错误 错误 1 无法将类型 System Data Entity Inf
  • ODP.Net - OracleDataReader.读取速度非常慢

    我在 ODP Net 中的 OracleDataReader 方面遇到很多麻烦 基本上 我有一个参数化查询 需要 1 5 秒的时间来运行 返回大约 450 条记录 然后需要 60 90 秒的时间来循环 甚至没有代码在循环中运行 实际上是迭代
  • 将 MVC 操作结果发送到打印机

    我有一个带有操作的控制器 SomeController ActionToBePrinted ActionToBePrinted 返回一个 html 视图 当按下按钮时 从普通的 mvc razor 视图调用此操作 当按下按钮时 我将如何将视
  • C# Winform - 当用手指在触摸屏上移动到控件末尾时如何防止移动整个窗口

    我正在开发用于触摸屏的全屏 winform 应用程序 当我在表单上有任何控件时 例如listbox webBrowserControl 它具有可见的滚动条 有要滚动的内容 当我用手指移动到控件的末尾时 完整的表单向上 向下移动取决于移动方向
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 我的 C# .NET 团队是否应该迁移到 Windows Presentation Foundation? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • [程序名称].exe已停止工作

    我有一个基于 Framework 2 0 构建的 NET 应用程序 我已经为它构建了一个安装程序 并尝试在具有 3 5 的计算机上运行它 所有相关环境均在Windows 7上 该应用程序在我的开发机器上以 VS 调试模式完美运行 该机器也具
  • 尽管日志输出没有报告错误,但 ILMerge 生成的程序集无法运行 - 这是为什么?

    我正在为一个新项目测试 ILMerge 尽管 exe 文件似乎已正确创建 但它无法运行 我已经通过 msi 安装程序安装了 ILMerge 在此处找到 http www microsoft com download en confirmat
  • 为什么 C# ProcessStartInfoRedirectStandardOutput 会导致 xcopy 进程失败

    这有点痛苦 因为我现在没有代码 但我会尽力解释 我有一个简单的 C 应用程序 它启动 Ruby 脚本 它还执行一些其他操作 因此它生成一个批处理文件并执行该文件 我正在使用 C 进程对象并设置以下内容 重定向标准输出 true 重定向标准错
  • Visual Studio Intellisense 颜色编码不起作用

    现在 在我的代码中 突然有些代码的颜色未编码为 Visual Studio 经典主题颜色 我不确定我的代码中是否存在错误 但是当我定义某些属性时 例如 public class VideoEncodeTest AndroidPowerTes
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft

随机推荐