在WPF中,数据模板是非常强大的工具,他是一块定义如何显示绑定的对象的XAML标记。有两种类型的控件支持数据模板:(1)内容控件通过ContentTemplate属性支持数据模板;(2)列表控件通过ItemTemplate属性支持数据模板。为了能够进一步提升数据模板的功能,在使用中常常会要求动态选择数据模板。对于列表控件,可以通过设置DataType来解决,复杂时需要使用模板选择器。以下主要谈论以下内容控件中的模板选择。

在WPF中,有时内容控件(如ContentControl,Button等)会根据数据对象的类型而需要动态变换,可以使用数据模板配合模板选择器来解决。模板选择器需要从System.Windows.Controls.DataTemplateSelector继承,重写其SelectTemplate方法,在该方法中根据item的类型或item属性来选择合适的数据模板。为了能够选择模板,需要将模板定义为属性,如public DataTemplate BoxGirderTemplate { get; set; }等等。

public class MyContentTemplateSelector:DataTemplateSelector
    {
        public DataTemplate BoxTemplate { get; set; }
        public DataTemplate SlabTemplate { get; set; }
        public DataTemplate TGirderTemplate { get; set; }
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            ISec s = (ISec)item;
            if (s!=null&&s.Name == "Box")
                return BoxGirderTemplate;
            else if (s != null && s.Name == "Slab")
                return SlabTemplate;
            else if (s != null && s.Name == "TGirder")
                return TGirderTemplate;
            return null;
        }
    }

在xaml中,在内容控件中实例化模板选择器。在实例化模板选择器的过程中,将数据模板作为模板选择器的参数注入,代码如下:

<ContentControl Name="MyContentControl">
                <ContentControl.ContentTemplateSelector>
                    <local:ElementPropContentTemplateSelector BoxTemplate="{StaticResource BoxGirder}"  SlabTemplate="{StaticResource Slab}"  TGirderTemplate="{StaticResource TGirder}"/>
                </ContentControl.ContentTemplateSelector>
            </ContentControl>

此外,在Windows.Resources中,需要定义数据模板,代码如下:

<Window.Resources>
        <DataTemplate x:Key="BoxGirder">
            <StackPanel >
                     ..........................
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="Slab">
              <StackPanel >
                     ..........................
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="TGirder">
        <StackPanel >
                     ..........................
            </StackPanel>
        </DataTemplate>

<Window.Resources>

WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用的更多相关文章

  1. WPF中的数据模板(DataTemplate)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate)        ...

  2. WPF中的数据模板(DataTemplate)

    原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate)                                                   ...

  3. wpf中的数据模板

    wpf中的模板分为数据模板和控件模板,我们可以通过我们自己定制的数据模板来制定自己想要的数据表现形式.例如:时间的显示可以通过图片,也可以通过简单数字表现出来. 例如: (1)先在Demo这个命名空间 ...

  4. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  5. WPF中的数据验证

    数据验证 WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理. 数据转换和数据验证便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换. V ...

  6. WPF 中获取DataGrid 模板列中控件的对像

    WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...

  7. WPF中的菜单模板

    原文:WPF中的菜单模板 资源字典代码如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xa ...

  8. WPF 后台获得 数据模板里的内容控件(DataTemplate)

    原文:WPF 后台获得 数据模板里的内容控件(DataTemplate) 假如      <Window.Resources> 里 有一个 Datatemplate 我想获得TextBlo ...

  9. WPF的ComboBox 数据模板自定义

    WPF的ComboBox 有些时候不能满足用户需求,需要对数据内容和样式进行自定义,下面就简要介绍一下用数据模板(DataTemplate)的方式对ComboBox 内容进行定制: 原型设计如下: 步 ...

随机推荐

  1. 在sqlserver中如何从字符串中提取数字,英文,中文,过滤重复字符

    原文:在sqlserver中如何从字符串中提取数字,英文,中文,过滤重复字符 最近做项目的时候,经常用到一个字符串中的某些字符,处理起来非常的棘手,现在用下面的方法就可以很方便的从字符串中处理你想要的 ...

  2. Word中如何让两个图片垂直居中对齐

    如图,两个图片都剧终了,大小也一致,但是发现没有对齐,那是因为需要设置(矩阵框住的)缩进,让两个在一起,上下对齐.

  3. 速查笔记(Linux Shell编程<上>)

    转载自: http://www.cnblogs.com/stephen-liu74/archive/2011/11/01/2202027.html 零.shell中的内部变量: 1.    $?:   ...

  4. 【共享单车】—— React后台管理系统开发手记:UI菜单各个组件使用(Andt UI组件)

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  5. Wamp访问缓慢、本地主机访问缓慢解决方案

    Wamp访问缓慢.本地主机访问缓慢解决方案 Wamp访问速度缓慢可能的原因:          1.一般原因: Wamp的日志文件太大.处理办法,将位于wamp/logs/下的日志文件清空.     ...

  6. C#的三大难点之二:托管与非托管

    相关文章: C#的三大难点之前传:什么时候应该使用C#?​C#的三大难点之一:byte与char,string与StringBuilderC#的三大难点之二:托管与非托管C#的三大难点之三:消息与事件 ...

  7. 安装Reshaper后Intellisense失效

    安装Reshaper后Intellisense失效或希望用vs2017的Intellisense功能 安装完毕后,IDE 的智能提示(Intellisense)便会默认使用 Resharper 的提示 ...

  8. Python修改文件权限

    os.chmod()方法 此方法通过数值模式更新路径或文件权限.该模式可采取下列值或按位或运算组合之一: stat.S_ISUID: Set user ID on execution. stat.S_ ...

  9. linux 登陆key生成

    1.登录A机器 2.ssh-keygen -t rsa,将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub Generating public/priv ...

  10. java之静态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 定义: - 为其他对象提供一种代理以控制对这个对象的访问 组成: 抽象角色:通过接口或抽象类声明真正角色实现的业务方法 真实角色:实现抽象角色,定义真 ...