WPF中如何根据数据类型使用不同的数据模板

news/2024/9/20 15:22:22/文章来源:https://www.cnblogs.com/zhaotianff/p/18380995

我们在将一个数据集合绑定到列表控件时,有时候想根据不同的数据类型,显示为不同的效果。

例如将一个文件夹集合绑定到ListBox时,系统文件夹显示为不同的效果,就可以使用模板选择器功能。

WPF提供了一个模板选择器类型DataTemplateSelector,它可以根据数据对象和数据绑定元素来选择 DataTemplate。

 

使用方法

创建一个类,继承自DataTemplateSelector,并重写SelectTemplate方法。

类似下面这样

 1 using System.Windows;
 2 using System.Windows.Controls;
 3 
 4 namespace SDKSample
 5 {
 6     public class TaskListDataTemplateSelector : DataTemplateSelector
 7     {
 8         public override DataTemplate
 9             SelectTemplate(object item, DependencyObject container)
10         {
11             FrameworkElement element = container as FrameworkElement;
12 
13             if (element != null && item != null && item is Task)
14             {
15                 Task taskitem = item as Task;
16 
17                 if (taskitem.Priority == 1)
18                     return
19                         element.FindResource("importantTaskTemplate") as DataTemplate;
20                 else
21                     return
22                         element.FindResource("myTaskTemplate") as DataTemplate;
23             }
24 
25             return null;
26         }
27     }
28 }

 

下面我们使用ListBox和TreeView进行演示

 

ListBox的使用示例

我们先定义如下的数据模型

 1  public class FileData
 2  {
 3      public string FileName { get; set; }
 4  }
 5 
 6  public class FileData1 : FileData
 7  {
 8      public string FileData1Property { get; set; }
 9  }
10 
11  public class FileData2:FileData
12  {
13      public string FileData2Property { get; set; }
14  }

 

然后定义一个资源字典,分别在里面定义两种数据的数据模板

 1 <DataTemplate x:Key="FileData1Datatemplate">
 2     <Grid>
 3         <Grid.ColumnDefinitions>
 4             <ColumnDefinition/>
 5             <ColumnDefinition/>
 6         </Grid.ColumnDefinitions>
 7         <Label Content="{Binding FileName}" FontSize="20" Foreground="Green"></Label>
 8         <Label Content="{Binding FileData1Property}" Grid.Column="1" VerticalAlignment="Center"></Label>
 9     </Grid>
10 </DataTemplate>
11 
12 <DataTemplate x:Key="FileData2Datatemplate">
13     <Grid>
14         <Grid.ColumnDefinitions>
15             <ColumnDefinition/>
16             <ColumnDefinition/>
17         </Grid.ColumnDefinitions>
18         <Label Content="{Binding FileName}" FontSize="16" Foreground="Red"></Label>
19         <Label Content="{Binding FileData2Property}" Grid.Column="1" VerticalAlignment="Center"></Label>
20     </Grid>
21 </DataTemplate>

 

添加测试数据

 1  List<FileData> fileDatas = new List<FileData>();
 2  FileData1 fileData1 = new FileData1();
 3  fileData1.FileName = "1.jpg";
 4  fileData1.FileData1Property = "1.jpg property";
 5  FileData2 fileData2 = new FileData2();
 6  fileData2.FileName = "2.jpg";
 7  fileData2.FileData2Property = "2.jpg property";
 8  fileDatas.Add(fileData1);
 9  fileDatas.Add(fileData2);
10  this.listbox.ItemsSource = fileDatas;

 

然后再为ListBox设置DataTemplateSelector

1  this.listbox.ItemTemplateSelector = new ItemDataTemplateSelector();

 

运行效果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/787516.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typecho Joe 导航菜单目录以及搜索关键字回显主题优化版

Joe 是 Typecho 博客中一款开源免费且非常精美的主题,但是这款主题很早就停止维护了,有些功能作者并没有开发,并且在 Typecho 更新到 1.2.1 版本后还出现了一个小 BUG Joe 主题的知名度很高,所以在原作者停止维护后很多大佬发布过自己魔改的版本,不可否认魔改后的主题 BUG…

gdb学习记录

目录如何查看地址值查看当前函数参数多线程调试只暂停指定线程,其他线程不影响总结如何查看地址值 查看下一个地址:x/x 0x12345679 以八进制显示:x/o 0x12345678 以十进制显示:x/d 0x12345678 显示更多的地址和值:x/8xw 0x12345678(显示从该地址开始的8个字(word),每个…

UE4 CharacterMovementComponent

之前在学习网络通信时,经常需要对客户端上的行为进行预测,来降低延迟带来的比较差的体验。而UE4为角色移动提供了CharacterMovementComponent这个组件,其在移动时可以发现已经实现了客户端预测。 现在可以通过对CharacterMovementComponent进行扩展,实现我们自定义的运动模…

抖音coze接入网站实现智能在线客服

在coze.cn上创建好机器人并且可以发布为API,方便接入自己的系统 一定要先创建新令牌,再点发布,并且必须勾选,发布到API 在客服系统gofly.v1kf.com中配置 【菜单】【团队设置】【大模型设置】接口地址部分,请填写扣子的机器人ID 接口密钥部分,请填写扣子的API令牌然后…

centos9(linux): 安装clamav

一,官方网站 https://www.clamav.net/ 如图:二,安装 1,开启epel仓库 [root@blog ~]# yum install -y epel-release 2,安装clamav [root@blog ~]# yum install clamav 说明:病毒库数据较大,200多M,安装时需要等待较长时间 安装完成后查看clamav的版本: [root@blog ~]# clam…

pygame手搓五子棋

代码:#coding=utf-8import os,sys,re,time import pygame import random from win32api import GetSystemMetricspygame.init() pygame.display.set_caption("五子棋")percent = 0.6 screen_width = GetSystemMetrics(0) screen_height = GetSystemMetrics(1) windo…

网站提示404错误:页面未找到怎么办

当网站提示 404 Error 或 “页面未找到” 时,这意味着客户端尝试访问的资源在服务器上不存在或无法找到。这种情况很常见,可以通过以下几个步骤来诊断和解决问题: 常见原因URL 输入错误:这是最常见的原因之一。由于人为疏忽或输入错误,导致请求的 URL 与服务器上实际存在的…

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

前言一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。  本篇使用stitcher匹配,进行两张图来视野合并拼接。 Demo 两张图拼接过程步骤一:…

WPF 路由事件

一、什么是路由事件? 根据MSDN定义:功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是由 类的实例支持的 CLR 事件, RoutedEvent 由事件 Windows Presentation Foundation (WPF) 系统处理。…

【转载】Win11优化大小核调度(无需重启)

出处:https://bbs.saraba1st.com/2b/thread-2140520-1-1.html 打开隐藏电源管理选项: 管理员模式运行cmd,分别输入: powercfg -attributes SUB_PROCESSOR 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 -ATTRIB_HIDE powercfg -attributes SUB_PROCESSOR 93b8b6dc-0698-4d1c-9ee4-…

【Pytorch教程】迅速入门Pytorch深度学习框架

@目录前言1.tensor基础操作1.1 tensor的dtype类型1.2 创建tensor(建议写出参数名字)1.2.1 空tensor(无用数据填充)API示例1.2.2 全一tensor1.2.3 全零tensor1.2.4 随机值[0,1)的tensor1.2.5 随机值为整数且规定上下限的tensorAPI示例1.2.6 随机值均值0方差1的tensor1.2.7 从…

AMD显卡VGA转HDMI花屏或者雪花屏解决办法

本以为是显卡或者显示屏或者转接线有问题,查阅资料后得出VGA转HDMI花屏或者雪花屏解决办法: 进入AMD控制面板。点击设置 - > 显示器 - > 覆盖 - > 禁用HDCP 即可完美解决问题。