泛型类的标记扩展

原文出处:http://www.codeproject.com/Tips/871592/Markup-Extension-for-Generic-classes

标记扩展运行你再Xaml中声明泛型类。

简介:

我们经常要在Xaml中的style或DataTemplate或相似的地方使用泛型类。

然而.Net不允许在xaml中声明泛型。我们需要解决这个问题。本文提供的解决方案已经在很多案例中解决这个问题。

使用代码:

通过使用这里提供的新的扩展,你就能够在xaml中使用泛型。

<DataTemplate x:Key="genericTemplate" DataType="{ge:Generic GenericTypeName=System.Collections.Generic.KeyValuePair, GenericTypeAssemblyName=mscorlib, ArgumentType1={x:Type sys:String},ArgumentType2={x:Type sys:String}}">
            <StackPanel Orientation="Horizontal">
                <Label Background="Green" Content="{Binding Path=Key}" />
                <Label Background="Yellow" Content="{Binding Path=Value}" />
            </StackPanel>
        </DataTemplate>

在我们的标记扩展类添加下面的属性:

public string GenericTypeName { get; set; }
        public string GenericTypeAssemblyName { get; set; }
        public Type ArgumentType1 { get; set; }
        public Type ArgumentType2 { get; set; }
        public Type ArgumentType3 { get; set; }

添加ProvideValue方法:

public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var genericArguments = new List<Type>();
            if(ArgumentType1 != null)
            {
                genericArguments.Add(ArgumentType1);
            }
            if(ArgumentType2 != null)
            {
                genericArguments.Add(ArgumentType2);
            }
            if(ArgumentType3 != null)
            {
                genericArguments.Add(ArgumentType3);
            }

            if(!string.IsNullOrWhiteSpace(GenericTypeName) && !string.IsNullOrWhiteSpace(GenericTypeAssemblyName) && genericArguments.Count > 1)
            {
                var genericType = Type.GetType(string.Format(_genericTypeFormat, GenericTypeName, genericArguments.Count, GenericTypeAssemblyName));
                if(genericType != null)
                {
                    var returnType = genericType.MakeGenericType(genericArguments.ToArray());
                    return returnType;
                }
            }
            return null;
        }

注意这儿有一个常量genericTypeFormat的声明如下:

private const string _genericTypeFormat="{0}`{1},{2}";

~~

时间: 2024-08-02 19:13:03

泛型类的标记扩展的相关文章

WPF:实现自定义标记扩展

标记扩展使用{标记扩展类 参数}语法,如: <TextBlock Text={x:Null}/> 为什么x:Null就可以返回一个null值呢? 其实在System.Windows.Markup命名空间中存在一个名为“NullExtension”的类型. 在解析到x:Null的时候,实际上会实例化NullExtension的一个对象. 而NullExtension实现了抽象类MarkupExtension,MarkupExtension中提供了抽象方法: public abstract obj

标记扩展和 WPF XAML

本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF XAML 的标记扩展. 本主题包括下列各节. XAML 处理器和标记扩展 基本标记扩展语法 XAML 定义的标记扩展 特定于 WPF 的标记扩展 *Extension 类 转义序列和标记扩展 XAML 用法中的嵌套标记扩展 标记扩展和属性元素语法 相关主题 XAML 处理器和标记扩展 通常,XAML 分析

WPF(4)类型转换器和标记扩展

介绍 之前讨论了WPF的基础架构,然后逐步开始学习布局面板,转换,介绍了不同的控件,容器,UI转换等.在这篇文章中,我将讨论每个创建XAML应用前的开发人员应该了解的关于XAML最重要的东西. 标记扩展是一种对XAML的扩展,你可以用来对基于XAML的程序应用自定义的规则.在你的设计中,你如果有任何的想对你的程序施加的自定义行为,你都可以使用标记扩展来实现.这里我们将讨论你可以怎样使用标记扩展对XAML生成自定义的行为. XAML或者说可扩展应用程序标记语言实际上是一种定义了特殊架构的XML格式

泛型类的自定义

为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候. 采用泛型类,完成扩展. 例如有一个学生类 Java代码  [url=][/url] Student{ Student(){ System.out.println("I'm a student....."); } } 有一个老师类 Java代码  [url=][/url] Teacher{ Teacher(){ System.out.println("I'm a teacher....."); } } 定义

UE4 插件扩展引擎工具栏

UE4 作为游戏引擎,已经提供了非常强大的游戏开发的API.作为游戏制作者来讲,我们需要一些专用的功能辅助我们更好的开发游戏,而不是仅仅从构建游戏逻辑出发.因此也就有了扩展编辑器功能的这个想法,还好 UE4 提供了许多编辑器的接口,便于我们给编辑器添加我们的功能. 下面是一个扩展编辑器工具栏的例子,我们增加了一个自己的按钮.这个在新建插件,选择 Editor Standalone Window 就可以实现此效果.我这里新建一个空的插件,来实现这个效果,以便于理解. UE4 是以模块的功能构建项目

c#开发移动APP-Xamarin入门扩展剖析

上节将Phoneword应用程序扩展到包含第二个屏幕,该屏幕可以跟踪应用程序的拨打历史 Navigation Xamarin.Form提供了一个内置的导航模型,用于管理一堆页面的导航和用户体验,这个模型实现了Page对象的后进先出(LIFO)堆栈,要从一个页面移动到另一个页面,应用程序将把一个新页面推到这个堆栈上,要返回到前一个页面,应用程序将从堆栈中弹出当前页面. Xamarin.Forms有一个NavigationPage类,用于管理Page对象的堆栈,NavigationPage类还将在页

Swift4.2语言指南(二十七) 访问控制

访问控制限制从其他源文件和模块中的代码访问部分代码.此功能使您可以隐藏代码的实现细节,并指定一个首选接口,通过该接口可以访问和使用该代码. 您可以为各个类型(类,结构和枚举)以及属于这些类型的属性,方法,初始值设定项和下标分配特定的访问级别.协议可以限制在某个上下文中,全局常量,变量和函数也可以. 除了提供各种级别的访问控制外,Swift还通过为典型方案提供默认访问级别来减少指定显式访问控制级别的需求.实际上,如果您正在编写单目标应用程序,则可能根本不需要指定显式访问控制级别. 注意 为简洁起见

Java5~11新特性

Java5~11版本新特性 Java5 Java6 Java7 Java8 Java9 Java10 Java11 Java5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性列表 泛型 枚举 自动装箱拆箱 可变参数 注解 foreach循环(增强for.for/in) 静态导入 格式化(System.out.println 支持%s %d等格式化输出) 线程框架/数据结构 JUC Arrays工具类/StringBuilder/instrument 1.泛型 所谓类型擦

UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解

{x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展.虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Binding} 要少,且支持更好的调试. 参照网址:{x:Bind} 标记扩展,GitHub微软UWP实例之XamlBind 1,{x:Bind} 基本原理 在 XAML 加载时,{x:Bind} 将转换为你所需的绑定对象,此对象将从数据源上的某一属性中获取相关值.绑定对象可以配置为观察数据源属性值的更改