通过


IProvideValueTarget 接口

定义

表示报告标记扩展评估情况对象属性关系的服务。

public interface class IProvideValueTarget
public interface IProvideValueTarget
type IProvideValueTarget = interface
Public Interface IProvideValueTarget

注解

IProvideValueTarget 表示一个服务,该服务报告有关调用值转换器周围的对象属性结构的信息。

当 XAML 对象编写器调用值转换行为时,类型转换器和标记扩展可以在 XAML 对象编写器提供的服务上下文中查询 IProvideValueTarget 作为服务。 有关详细信息,请参阅适用于类型转换器和标记扩展的 XAML 和服务上下文的类型转换器和标记扩展

具体而言,对于标记扩展,有用的方案 IProvideValueTarget 是确定标记扩展的情况用法的有效性。 例如,标记扩展可能实现值延迟机制,但仅当目标对象能够在运行时使用延迟机制的其他组件时,才适用该机制。 可以检查返回 TargetObject 的对象的类型系统特征,并确保该对象支持延迟技术。 如果是这样,标记扩展将返回一个值,否则,标记扩展将引发一个异常,该异常将被 XAML 对象编写器作为内部异常进行选取。 类似的方案通过检查类型的系统特征 TargetProperty,确保特定属性支持功能。

尽管 API 名称可能意味着与该名称IProvideValueTarget关联,但所IProvideValueTarget报告的信息也可能对或TypeConverterValueSerializerMarkupExtension.ProvideValue TypeConverter或者ValueSerializer通常具有比标记扩展更多的上下文,因为它们专用于特定的目标类型或目标属性,因此在类型系统中通常可预测情况有效性。 但是,存在其他方案。 下面是一些可能由类型转换器或标记扩展实现的方案的列表:

  • 获取 TargetObject 读取该对象上其他属性的实例值。 请注意,此处的处理对于未设置值可能很可靠,因为目标对象上 XAML 成员的处理顺序可能是不确定的。

  • 获取 TargetObject 读取类型级元数据,或验证类型是否实现了所需的接口。

  • 获取 TargetProperty 读取属性元数据。

一种方案是使用 IProvideValueTarget 信息来限制标记扩展允许设置的对象或属性。

在尝试使用该服务之前,请确保服务本身不是 null 由你用于上下文的相关服务提供商参数返回的。

重要

使用服务时,尤其重要的是不要修改属性引用 TargetObject 的对象或该对象引用的其他对象。 具体而言,对于 WPF,这些更改可能会导致意外更改使 WPF 属性系统失效。

注释

请勿使用类型 TargetProperty 来确定标记扩展或类型转换器应返回的精确类型。 这不是最佳做法。 返回类型应与属性MarkupExtensionReturnTypeAttribute (对于标记扩展)或模式(类型转换器的类名)保持一致。

在早期版本的 .NET Framework 中,此接口存在于特定于 WPF 的程序集 WindowsBase 中。 在 .NET Framework 4 中, IProvideValueTarget 位于 System.Xaml 程序集中。 有关详细信息,请参阅 从 WPF 迁移到 System.Xaml 的类型

WPF 用法说明

此服务支持在依赖属性上绑定等框架功能。

在 WPF 中,表示 IProvideValueTarget 的服务可以返回对象和属性,这些情况下,要从标记扩展或类型转换器返回的值取决于上下文。

IProvideValueTarget 在内部实现 BindingBase中被大量利用,即实现 WPF 中依赖项属性的绑定机制的类。

WPF 的默认内部服务提供商实现 IProvideValueTarget 自定义标记扩展或类型转换器的用法。 只能由内部 WPF 服务设置所报告 IProvideValueTarget 的对象和属性。 超越此定义的操作方式 IProvideValueTarget ,需要定义你自己的服务提供程序来定义标记扩展和类型转换器用法,这些用法至少 IProvideValueTarget 实现和服务 IXamlTypeResolver ,这是此处未介绍的高级方案。

null 值TargetPropertyTargetObject并不一定意味着标记扩展或类型转换器不能执行,尽管这取决于你的实现。 例如,即使服务可用,也是如此, IProvideValueTarget 例如,如果标记扩展嵌套在另一个标记扩展(如 a) Binding中,也是如此。 依赖的 IProvideValueTarget 实现应始终检查 null 值,前提是仅出于引发特定异常的目的(如果是预期设计)。

属性

名称 说明
TargetObject

获取要报告的目标对象。

TargetProperty

获取所报告的目标属性的标识符。

适用于

另请参阅