Type Converters ,Markup Extensions,IValueConverter的区别

Type Converters和Markup Extensions是 XAML 类型系统和 XAML 编写器用来生成对象图组件的两种技术。 尽管类型转换器和标记扩展共享一些特征,但它们在 XAML 节点流中以不同的方式表示。 在本文档集中,Type Converters、Markup Extension和类似的构造有时统称为值转换器。

值转换器

在 XAML 中,值转换器能用于各种方案。 以下列表显示了 XAML 中不同类型的值转换器:

  • 类型转换器
  • 标记扩展
  • 值序列化程序
  • 为 XAML 文本语法提供逻辑的相关类或支持类

类型转换器

在 .NET Framework XAML 服务定义中,类型转换器是从 CLR TypeConverter 类派生的类。 TypeConverter 是一个在 XAML 存在之前就存在于 Microsoft .NET Framework 中的类。 它的原始用途是向 IDE 属性提供对属性窗口和类似的基于文本的编辑隐喻的支持。 对 .NET Framework 引入 XAML 则使用 TypeConverter 将文本语法(如某一特性值或 XAML 值节点中的)转换为对象。 TypeConverter 还可用于将对象值序列化为文本语法。 TypeConverter 还用于此前 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 中特定于框架的 XAML 实现。 有关 XAML 中 TypeConverter 的更多信息,请参见 Type Converters for XAML Overview

标记扩展

在 .NET Framework XAML 服务实现中,标记扩展是从 MarkupExtension 类派生的类。 标记扩展是此窗体中一个源于 XAML 语言的概念。 你可以将标记扩展视为类似于可扩展转义序列的东西,它会调入服务类以提供其逻辑。 就标记而言,XAML 处理器普遍通过以文本字符串中一个左大括号 ({) 开头的文本序列来识别标记扩展。

标记扩展不同于类型转换器。 类型转换器通常与类型或成员相关联。 当创建对象图或进行序列化期间遇到与那些实体相关联的文本语法时会调用它们。

标记扩展与单一支持服务类相关联,但可以应用于任意成员值。 (但是,通过使用服务上下文,你可以实现你的标记扩展以有意将其应用限制为仅对某些成员或目标类型进行应用。) 标记扩展可以替代类型转换器关联。 或者,可将其用于为本来不支持文本语法的成员指定特性值。

有关 XAML 的标记扩展实现模式的详细信息,请参阅 Markup Extensions for XAML Overview

注意

MarkupExtension 和 ValueSerializer 类型都在 System.Windows.Markup 命名空间内而不是在 System.Xaml 命名空间内。 这并不意味着这些类型是特定于 WPF 或特定于本来会填充包含字符串 Windows 的 CLR 命名空间的 Windows 窗体 技术。 MarkupExtension 和ValueSerializer 都在 System.Xaml 程序集中,并且没有特定的框架依赖关系。 这些类型存在于 .NET Framework 3.0 的CLR 命名空间中,并保留在 .NET Framework 4 的 CLR 命名空间中,以避免破坏现有 WPF 项目中的引用。 有关详细信息,请参阅Types Migrated from WPF to System.Xaml

值序列化程序

ValueSerializer 是针对将对象转换为字符串进行了优化的专用的类型转换器。 XAML 的 ValueSerializer 可能完全不会实现 ConvertFrom 方法。ValueSerializer 实现以类似于 TypeConverter 实现的方式获取服务。 虚方法提供了一个输入 context 参数。 context 参数的类型为IValueSerializerContext,它继承自 IServiceProvider 接口,并具有 GetService 方法。

在 XAML 类型系统中,对于使用 XAML 节点循环处理进行序列化的 XAML 编写器实现,由其自身的 XamlType.ValueSerializer 属性报告与某一类型或成员相关联的值转换器。 执行序列化的 XAML 编写器的含义是,如果存在 XamlType.TypeConverter 和 XamlType.ValueSerializer,则类型转换器应用于加载路径,值序列化应用于保存路径。 如果 XamlType.TypeConverter 存在但 XamlType.ValueSerializer 为 null,则类型转换器也用于保存路径。

其他值转换器

值转换器具有超越类型转换器或标记扩展的特定模式的可扩展性。 但是,此自定义也需要由 .NET Framework XAML 服务提供的 XAML 类型系统的重新定义。 现有的 XAML 类型系统具有针对类型转换器、标记扩展和值序列化程序(而无针对值转换的自定义窗体的)的表示形式和报告系统。如果你想要创建自定义值转换器,请使用 XamlValueConverter<TConverterBase> 类型。

组合使用类型转换器和标记扩展

标记扩展和类型转换器在 XAML 中用于不同情况。 尽管上下文可用于标记扩展用途,但通常不会在标记扩展实现中检查属性的类型转换行为(其中标记扩展提供了一个值)。 换言之,即使标记扩展返回一个文本字符串作为其 ProvideValue 输出,该字符串上应用于特定属性或属性值类型的类型转换行为也不会被调用。 通常,标记扩展的目的是处理字符串并返回不涉及任意类型转换器的对象。

值转换器的服务上下文

当实现值转换器时,你经常需要访问在其中应用了值转换器的上下文。 此上下文称为服务上下文。 服务上下文可能包括如下信息:活动的 XAML 架构上下文、对 XAML 架构上下文和 XAML 对象编写器提供的类型映射系统的访问权限等等。 有关可用于值转换器的服务上下文和如何访问服务上下文可能会提供的服务的详细信息,请参阅 Service Contexts Available to Type Converters and Markup Extensions

IValueConverter主要是用于数据绑定时类型转换。如果您想要将值转换器与绑定相关联,创建一个类以实现 IValueConverter 接口,然后实现 Convert 和 ConvertBack 方法。 转换器可以将数据从一种类型更改为另一个,将根据区域性信息的数据转换或修改其他方面的演示文稿

转自MSDN https://msdn.microsoft.com/zh-cn/library/ee621339.aspx

时间: 2024-11-04 20:35:01

Type Converters ,Markup Extensions,IValueConverter的区别的相关文章

input type=&quot;submit&quot; 和&quot;button&quot;有什么区别

HTML中<input type="submit" /> 和 <input type="button" /> 主要从元素定义类型.点击触发动作两个方面来区别. 一.元素定义类型的区别: 1.<input type="button" /> 定义为一个可点击的按钮. 2.<input type="submit" /> 定义为一个提交按钮.提交按钮会把表单数据发送到服务器. 二.点击触

Go语言中初始化变量中字面量&amp;Type{}、new、make的区别

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用. 变量的声明 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程序中使用.当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil. 对于例子中的两种类型的声明,我们可以直接使用,对

Pytthon:type函数和 isinstance 函数及区别

Python中,type和isinstance都可以进行类型检查,用的最多的就是type()了(其实我是一直用type()).内建函数type(object)用于返回当前对象的类型,比如type(1)返回<type 'int'>.因此可以通过与python自带模块types中所定义的名称进行比较,根据其返回值确定变量类型是否符合要求.例如判读一个变量a是不是list类型,可以使用以下代码: if type(a) is types.ListType: 所有的基本类型对应的名称都可以在types模

input type=&quot;submit&quot; 和&quot;button&quot;有什么区别?

在一个页面上画一个按钮,有四种办法: <input type="button" /> 这就是一个按钮.如果你不写javascript 的话,按下去什么也不会发生. <input type="submit" /> 这样的按钮用户点击之后会自动提交 form,除非你写了javascript 阻止它. <button> 这个按钮放在 form 中也会点击自动提交,比前两个的优点是按钮的内容不光可以有文字,还可以有图片等多媒体内容.(当然

type和role属性有什么区别呢

type是规定标签的类型,比如<input />标签中使用type="button"就是代表一个按钮 使用type="text" 就是一个文本框,type="radio" 单选框等等. role的作用是描述一个非标准的tag的实际作用,比如用div做button,那么设置div 的 role=“button”,辅助工具(这里就是div)就可以认出这实际上是个button.

在button中添加 type=&quot;button&quot;和不添加的区别

<button  type="button"  class="btn btn-success" onclick="page.search()">搜索</button> 我在项目中通过按钮搜索的时候  其中一个页面没有给button添加type="button" 时  点击搜索会重新进入页面 后台百度才知道  Internet Explorer 的默认类型是 "button",而其他浏

isinstance 和 type 的区别

class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isinstance(B(), A) # returns True type(B()) == A # returns False  摘自 区别就是: type()不会认为子类是一种父类类型. isinstance()会认为子类是一种父类类型. 注意:在 Python2 中是没有布尔型的,它用数字 0 表示 F

aufomaper Queryable Extensions ProjectTo

When using an ORM such as NHibernate or Entity Framework with AutoMapper's standard Mapper.Map functions, you may notice that the ORM will query all the fields of all the objects within a graph when AutoMapper is attempting to map the results to a de

Scala 深入浅出实战经典 第78讲:Type与Class实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/2vZ06RMcD6I/优酷:http://v.youku.com/v_show/id