打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WPF之DataTemplateSelector的运用

本文主要记录WPF中DataTemplateSelector的运用,数据模板选择器主要运用在一些项容器中用于根据不同的数据类型选择不同的DataTemplate,以便展示不同的数据。在此以在listbox显示字符串和一个颜色块来说明DataTemplateSelector的运用。

DataTemplateSelector运用的核心是需继承DataTemplateSelector类并重写其DataTemplateSelector方法,在UI上实现不同类型的DataTemplate,并将这不同的DataTemplate赋值给listbox的ItemTemlateSelector。

在一个listbox中显示文本还有颜色块,显示文本和颜色是两种不同的数据类型,实际项目中可以根据需要用不同的class类型设置不同的样式和模板,效果图如下:

 

以下为代码:

 public class DataModel1    {        public string Name { get; set; }        public DataModel1(string name)        {            Name = name;        }    }    public class DataModel2    {        public Brush Color { get; set; }        public DataModel2(Brush color)        {            Color = color;        }    }    public class DataModel    {        public Object Ob { get; set; }        public string TypeName { get; set; }    }  public class ListBoxDataTemplateSelector : DataTemplateSelector    {        public DataTemplate Template1 { get; set; }        public DataTemplate Template2 { get; set; }        public override DataTemplate SelectTemplate(object item, DependencyObject container)        {            Type t = item.GetType();            string typeName = null;            PropertyInfo[] properties = t.GetProperties();            foreach (PropertyInfo pi in properties)            {                if (pi.Name == "TypeName")                {                    typeName = pi.GetValue(item, null).ToString();                    break;                }            }            switch (typeName)            {                case "txt":                    return Template1;                case "color":                    return Template2;                default:                    return null;            }        }    }

 

Xaml:

Window x:Class="ListBoxExample.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:local="clr-namespace:ListBoxExample"        mc:Ignorable="d" Name="MainWindow1"        Title="MainWindow" Height="350" Width="525">    <Window.Resources>        <ControlTemplate x:Key="Template1">            <TextBlock Text="{Binding Ob.Name}"/>        </ControlTemplate>        <ControlTemplate x:Key="Template2">            <Border  Height="30" Width="90" Background="{Binding Ob.Color}"></Border>        </ControlTemplate>        <local:ListBoxDataTemplateSelector x:Key="ListBoxDataTemplateSelector">            <local:ListBoxDataTemplateSelector.Template1>                <DataTemplate>                    <ContentControl Template="{StaticResource Template1}"></ContentControl>                </DataTemplate>            </local:ListBoxDataTemplateSelector.Template1>            <local:ListBoxDataTemplateSelector.Template2>                <DataTemplate>                    <ContentControl Template="{StaticResource Template2}"></ContentControl>                </DataTemplate>            </local:ListBoxDataTemplateSelector.Template2>        </local:ListBoxDataTemplateSelector>    </Window.Resources>    <Grid Name="grid0" Width="100" Height="200">        <ListBox Name="list0" ItemTemplateSelector="{StaticResource ListBoxDataTemplateSelector}"  ItemsSource="{Binding Datas}"  >        </ListBox>    </Grid></Window>

数据的初始化和绑定:

 /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();            var vm = new Vm();            this.DataContext = vm;                  }    }    public class Vm    {        private ObservableCollection<DataModel> _Datas = new ObservableCollection<DataModel>();        public ObservableCollection<DataModel> Datas        {            get { return _Datas; }            set { _Datas = value; }        }               public Vm()        {            DataModel a1 = new DataModel { Ob = new DataModel1("This is name1"), TypeName = "txt" };            DataModel a2 = new DataModel { Ob = new DataModel2(Brushes.Red), TypeName = "color" };            DataModel a3 = new DataModel { Ob = new DataModel2(Brushes.Green), TypeName = "color" };            DataModel a4 = new DataModel { Ob = new DataModel1("This is name2"), TypeName = "txt" };            DataModel a5 = new DataModel { Ob = new DataModel2(Brushes.GreenYellow), TypeName = "color" };            _Datas.Add(a1);            _Datas.Add(a2);            _Datas.Add(a3);            _Datas.Add(a4);            _Datas.Add(a5);        }    }

以上是DataTemplateSelector的用法,下一小节将在此基础上增加左键单击,左键双击,右键单击及选中的交互用法。

 

来源:https://www.icode9.com/content-4-576751.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
4道稍微高级点的c 面试题,供初学者一窥门径
c++ 模板基础
STL模板c++类模板的通用版本局部特化和完全特化
C 类模版的继承
类模板(原创) - c++探索 - C++博客
UML建模与架构文档化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服