IProvideValueTarget 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示一个服务,该服务报告标记扩展评估的情景对象和属性的关系。
public interface class IProvideValueTarget
public interface IProvideValueTarget
type IProvideValueTarget = interface
Public Interface IProvideValueTarget
注解
IProvideValueTarget 表示一个服务,该服务报告有关调用值转换器的位置周围的对象属性结构的信息。
当 XAML 对象编写器调用值转换行为时,类型转换器和标记扩展可以在 XAML 对象编写器提供的服务上下文中查询 IProvideValueTarget 作为服务。 有关详细信息,请参阅 适用于 XAML 的类型转换器和标记扩展 以及 可用于类型转换器和标记扩展的服务上下文。
具体而言,对于标记扩展,一种有用的方案 IProvideValueTarget 是确定标记扩展的情景用法的有效性。 例如,标记扩展可能实现值延迟机制,但仅当目标对象能够在运行时使用延迟机制的其他组件时,才适合使用该机制。 可以检查返回TargetObject为 的对象的类型系统特征,并确保该对象支持延迟技术。 如果是这样,标记扩展将返回一个值,如果没有,标记扩展将引发一个异常,该异常将由 XAML 对象编写器作为内部异常进行选取。 类似的方案是通过检查 的类型系统特征 TargetProperty,确保特定属性支持功能。
尽管 API 名称IProvideValueTarget可能意味着与 MarkupExtension.ProvideValue关联,但 报告IProvideValueTarget的信息对 或 ValueSerializer也很有用TypeConverter。 TypeConverter或 ValueSerializer 通常具有比标记扩展更多的上下文,因为它们专用于特定的目标类型或目标属性,因此在类型系统中,情况有效性通常是可预测的。 但是,还有其他方案。 下面列出了一些可能由类型转换器或标记扩展实现的方案:
获取 TargetObject 以读取该对象上其他属性的实例值。 请注意,此处的处理对于未设置的值可能需要可靠,因为目标对象上 XAML 成员的处理顺序可能是不确定的。
获取 TargetObject 以读取类型级元数据,或验证所需的接口是否由类型实现。
获取 TargetProperty 以读取属性元数据。
一种方案是使用 IProvideValueTarget 信息来限制标记扩展允许设置的对象或属性。
在尝试使用该服务之前,请确保服务本身不是 null
由用于上下文的相关服务提供程序参数返回的。
重要
使用服务时,特别重要的是不要修改属性引用 TargetObject 的对象或该对象引用的其他对象。 具体而言,对于 WPF,这些更改可能会导致意外更改,从而使 WPF 属性系统失效。
注意
请勿使用 的类型 TargetProperty 来确定标记扩展或类型转换器应返回的精确类型。 这不是最佳做法。 返回类型应与标记扩展) MarkupExtensionReturnTypeAttribute 或模式 (类型转换器) 类名的归因 (一致。
在早期版本的 .NET Framework中,此接口存在于特定于 WPF 的程序集 WindowsBase 中。 在 .NET Framework 4 中, IProvideValueTarget 位于 System.Xaml 程序集中。 有关详细信息,请参阅 Types Migrated from WPF to System.Xaml。
WPF 用法说明
此服务支持框架功能,例如对依赖属性进行绑定。
在 WPF 中,对于要从标记扩展或类型转换器返回的值依赖于上下文的情况,由 IProvideValueTarget 表示的服务可以返回对象和属性。
IProvideValueTarget 在 的内部实现 BindingBase中被大量利用,该类在 WPF 中实现依赖属性的绑定机制。
WPF 的默认内部服务提供程序实现 IProvideValueTarget 供自定义标记扩展或类型转换器使用。 报告的 IProvideValueTarget 对象和属性只能由内部 WPF 服务设置。 要超出操作方式 IProvideValueTarget 的此定义,需要为标记扩展和类型转换器用法定义自己的服务提供程序,这些提供程序至少 IProvideValueTarget 实现 和 IXamlTypeResolver 服务,这是此处未介绍的高级方案。
或 TargetObject 的 TargetProperty null 值并不一定意味着标记扩展或类型转换器无法执行操作,尽管这取决于你的实现。 如果 标记扩展嵌套在另一个标记扩展(如 Binding)中,则中的IProvideValueTarget值即使服务可用,也为 null。 如果仅出于引发特定异常的目的(如果这是预期设计),依赖于 IProvideValueTarget 的实现应始终检查 null 值。
属性
TargetObject |
获取被报告的目标对象。 |
TargetProperty |
获取正在报告的目标属性的标识符。 |