zoukankan      html  css  js  c++  java
  • 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的用法,下一小节将在此基础上增加左键单击,左键双击,右键单击及选中的交互用法。

  • 相关阅读:
    SpringBoot Rabbitmq接收消息
    SpringBoot Rabbitmq发送消息
    Rabbitmq 介绍
    Eureka 使用Spring cloud config 管理中心启动
    Spring Cloud Config 搭建Config 服务
    Eureka 向Server中注册服务
    Eureka 配置
    给定一些分割符,给定一个待分割的字符串,打印出分割之后最长的字符串
    给定N个整数,乱序,分行打印每个数字和其位置
    给定一个整数,求它的二进制表示中有多少个1
  • 原文地址:https://www.cnblogs.com/qcst123/p/11918017.html
Copyright © 2011-2022 走看看