wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用

通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelector。请注意,如果具有不同类型的对象,则可以对 DataTemplate 设置 DataType 属性。如果您执行了此操作,则无需创建 DataTemplateSelector。此外,如果对象类型相同但属性不同,也可以考虑使用 DataTrigger 或数据转换器。

通俗讲,就是根据不同的数据选择不同的模板。接下来,我用一个例子来讲述DataTemplateSelector和动态绑定的使用方法。

下面例子如图,只要年龄大于50的使用一种模板,否则另一种模板,并在年龄大于50的模板中是男性的添加触发器使用背景变成蓝色的。

1、创建模板选择器

   public class MyDataTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var fe = container as FrameworkElement;
            var obj = item as Person;
            DataTemplate dt = null;
            if (obj != null && fe != null)
            {
                if (obj.age > 50)
                    dt = fe.FindResource("one") as DataTemplate;
                else
                    dt = fe.FindResource("two") as DataTemplate;

            }
            return dt;
        }
    }

2、界面设计:

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:MyDataTemplateSelector  x:Key="mydt"></local:MyDataTemplateSelector>
        <DataTemplate x:Key="one">
            <Border BorderThickness="2" BorderBrush="red" Background="AliceBlue">
                <StackPanel Orientation="Horizontal" Name="skp" >
                    <TextBlock Text="{Binding name}" Margin="10"></TextBlock>
                    <TextBlock Text="{Binding age}" Margin="10"></TextBlock>
                    <TextBlock Text="{Binding sex}" Margin="10"></TextBlock>
                </StackPanel>
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger  Value="男" Binding="{Binding Path=sex}">
                    <Setter TargetName="skp" Property="Background" Value="CornflowerBlue" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
        <DataTemplate x:Key="two" >
            <Border BorderThickness="1" BorderBrush="Blue" Background="YellowGreen" Padding="5" >
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding name}"  Margin="10"></TextBlock>
                    <TextBlock Text="{Binding age}" Margin="10"></TextBlock>
                    <TextBlock Text="{Binding sex}" Margin="10"></TextBlock>
                </StackPanel>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox Name="lb" ItemTemplateSelector="{StaticResource mydt}">

        </ListBox>
    </Grid>
</Window>

3、后台:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            LoadData();
            lb.ItemsSource = list;
        }
        public List<Person> list { get; set; }
        public void LoadData()
        {
            Random r = new Random();
            list = new List<Person>();
            for (int i = 0; i < 10; i++)
            {
                list.Add(new Person
                {
                    name = "张三" + i,
                    age = r.Next(100)
                });
            }
        }
    }
    public class Person
    {
        public string name { get; set; }
        public int age { get; set; }

    }
时间: 2024-08-08 15:13:24

wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用的相关文章

[WPF系列-数据邦定之DataTemplate 根据对象属性切换模板

  引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate)   切换模板的两种方式:   使用DataTemplateSelector来切换模板 使用DataTrigger来实现模板切换. 使用Style来是实现模板切换   A DataTemplateSelector does not respond to PropertyChange notifications, so it doesn't get re-evaluated

WPF快速入门系列(7)——深入解析WPF模板

一.引言 模板从字面意思理解是“具有一定规格的样板".在现实生活中,砖块都是方方正正的,那是因为制作砖块的模板是方方正正的,如果我们使模板为圆形的话,则制作出来的砖块就是圆形的,此时我们并不能说圆形的”砖块“不是砖块吧.因为形状只是它们的外观,其制作材料还是一样的.所以,模板可以理解为表现形式.WPF中的模板同样是表现形式的意思. 在WPF中包括三种模板:控件模板.数据模版和面板模板.它们都继承于FrameworkTemplate基类,其继承层次结果如下图所示: 从上图可以发现,Framewor

背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组

原文:背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ItemsControl) 项模板选择器 数据分组 示例1.ItemsControl 的项模板选择器Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo3.xaml <Page x:Class="Windo

uwp开发:数据模板选择器

这两天,在做<简影uwp>的首页推荐版块时,用到了数据模板选择器,所以简单介绍一下.数据模板选择器.顾名思义,就是可以选择性的展示不同的数据模板.那么,什么时候用数据模板选择器?怎么用呢?往下看: 应用场景: 同样是以我目前正在做的<简影uwp>为例,在做首页推荐版块时,要展示的数据是不同的版块的,都放在了一个集合中,这样的话,如果直接将数据绑定到ListView或者GridView上显示的话,是不可取的.虽然这些数据在一个集合内,但是因为集合内每个种类都不一样,显示的方式,展示的

WPF模板(二)应用

原文:WPF模板(二)应用 本次内容来源于电子书,和上一篇一样. 在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板,DataTemplate是数据模板,他们都派生自FrameworkTemplate抽象类. 1.ControlTemplate ControlTemplate:控件模板主要有两个重要属性:VisualTree内容属性和Triggers

WPF模板(一)详细介绍

原文:WPF模板(一)详细介绍 本次随笔来源于电子书,人家的讲解很好,我就不画蛇添足了. 图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程序设计中起着举足轻重的作用-----用户界面设计成什么样看上去才足够的漂亮?控件如何安排才简单易用并且少犯错误?这些都是设计师需要考虑的问题.WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,

2019-11-29-win10-uwp-列表模板选择器

原文:2019-11-29-win10-uwp-列表模板选择器 title author date CreateTime categories win10 uwp 列表模板选择器 lindexi 2019-11-29 10:18:0 +0800 2018-2-13 17:23:3 +0800 Win10 UWP 本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的

WPF 中关于 DataTemplateSelector 类的应用

MSDN的解释: 提供一种根据数据对象和与该数据绑定的元素来选择数据模板 DataTemplate 的方法. 示例代码: <Window x:Class="WpfApplication1.Window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

[WPF系列]-数据邦定之DataTemplate 使用 DataTrigger 来应用属性值

使用 DataTrigger 来应用属性值 当前表示不会告诉我们某个 Task 是家庭任务还是办公室任务.记住 Task 对象拥有类型为 TaskType 的 TaskType 属性,该类型是一个枚举,其值可以为 Home 和 Work. 在下面的示例中,DataTrigger 将 border 元素的 BorderBrush 设置为 Yellow(如果 TaskType 属性为 TaskType.Home).   <DataTemplate x:Key="myTaskTemplate&q