在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. Orchard FAQ

    Orchard学习视频已登录百度传课: http://www.chuanke.com/3027295-124882.html 问:Orchard用VS重新生成后为什么那么大? 答:因为每个模块的bin ...

  2. Windows 定时删除指定路径下N天前的日志文件

    Windows 定时删除指定路径下N天前的日志文件 Windows 下bat脚本文件的内容为 1. 删除指定路径下5天前的所有文件 @echo off set SrcDir=E:\WORK\Git s ...

  3. 如何暂停sqlserver数据订阅服务

    原文:如何暂停sqlserver数据订阅服务 从 Management Studio 启动和停止快照代理或日志读取器代理 在 Management Studio 中连接到发布服务器,然后展开服务器节点 ...

  4. JAVA常见算法题(十九)

    package com.xiaowu.demo; /** * * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. * * * @author WQ ...

  5. kata-container环境搭建

    一.安装qemu 注意,目前kata-container所要求的qemu最低版本是v2.7.0.在笔者的环境下(Ubuntu16.04 VM),apt-get官方源的最高版本是v2.5.0.所以不要用 ...

  6. 利用chrony和ntp搭建时间同步服务器

    利用chrony和ntp搭建时间同步服务器 环境说明 系统版本    CentOS 6.9 x86_64 Network Time Protocol(NTP,网络时间协议)用于同步它所有客户端时钟的服 ...

  7. 2017.9.15 postgres使用postgres_fdw实现跨库查询

    postgres_fdw的使用参考来自:https://my.oschina.net/Kenyon/blog/214953 postgres跨库查询可以通过dblink或者postgres_fdw来完 ...

  8. 转:MyBatis学习总结(Mybatis总结精华文章)

    http://www.cnblogs.com/xdp-gacl/tag/MyBatis%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ 当前标签: MyBatis学习总结   ...

  9. python——type()创建类

    今天我算是长知识了,我是一个python菜鸟,以前一直认为type(A)可以返回A的类型,但是不知道type还可以用于创建class,这篇经验就是介绍一下如何用type()创建一个类,以及如何设置该类 ...

  10. 计算两个有序数组的第K大数(转)

    传统解法,最直观的解法是O(m+n).直接merge两个数组,然后求第K大的数字. 如果想要时间复杂度将为O(log(m+n)).我们可以考虑从K入手.如果我们每次能够删除一个一定在第K个元素之前的元 ...