• WPF数据模板


    数据模板定义

    在WPF中我们可以为自己的数据定制显示方式,也就是说虽然某数据数据是一定的,但我们可以做到让它的表现方式多种多样,比如一个时间,在以前我们一般使用一个字符串(比如“12:03”)来显示,但我们为什么就不能显示一个小时钟呢,其实这更合乎情理,利用WPF中的数据模板技术随意并轻松地表现你的数据.

    数据模板使用示例

    首先,先造一点示例数据,创建一个Student实例,循环一点假数据

    List<Student> students = new List<Student>();
                for (int i = 1; i <= 5; i++)
                {
                    students.Add(
                        new Student {
                            Id = i, 
                            Photo = "46243214.jpg",
                            Name = $"傲慢与偏见{i}", 
                            Sex = $"{(i % 2 != 0 ? "男" : "女")}", 
                            IsGraduate = $"{(i % 2 == 0 ? "在读" : "毕业")}" });
                }
    

    前台XAML,这里我们使用一个表格来呈现

    <DataGrid
                x:Name="datagrid1"
                HorizontalAlignment="Center"
                AutoGenerateColumns="False"
                CanUserAddRows="False"
                ColumnWidth="*"
                GridLinesVisibility="Horizontal"
                IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Id}" Header="编号" />
                    <DataGridTemplateColumn Header="证件照">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Width="50" Source="{Binding Photo}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Binding="{Binding Name}" Header="姓名" />
                    <DataGridTextColumn Binding="{Binding Sex}" Header="性别" />
                    <DataGridTemplateColumn Header="是否毕业">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel
                                    HorizontalAlignment="Center"
                                    VerticalAlignment="Center"
                                    Orientation="Horizontal">
                                    <TextBlock Foreground="{Binding IsGraduate, Converter={StaticResource Graduate2Color}}" Text="⚫" />
                                    <TextBlock Text="{Binding IsGraduate}" />
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
    

    其中有两处使用到了数据模板,也就是关键字DataTemplate,效果如下图所示:

    image-20210627231938483

    注意到是否毕业那一列里面用到了一个转换器

    <TextBlock Foreground="{Binding IsGraduate, Converter={StaticResource Graduate2Color}}" Text="⚫" />
    

    转换器具体实现:

    public class GraduateConvert : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value != null)
                {
                    switch (value)
                    {
                        case "在读":
                            return "Green";
                        case "毕业":
                            return "Red";
                        default:
                            return "Gray";
                    }
                }
                return "Gray";
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    实现转换器需要继承IValueConverter,然后实现接口

    再来看另外一个栗子,效果图如下:

    image-20210627232222299

    这里使用的是ItemsControl,里面呈现的数据依然可以使用数据模板实现

    <DataTemplate x:Key="itemsControlDataTemplete">
                <StackPanel
                    Margin="0,5"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Center"
                    Orientation="Horizontal">
                    <Image Width="50" Source="{Binding Photo}" />
                    <TextBlock
                        Margin="20,0"
                        VerticalAlignment="Center"
                        Text="{Binding UserName}" />
                    <TextBlock VerticalAlignment="Center" Text="{Binding CreatTime}" />
                </StackPanel>
            </DataTemplate>
    

    最后,只需要将数据模板绑定到ItemsControl控件的ItemTemplate属性中

    <ItemsControl
                x:Name="itemControl1"
                Grid.Column="1"
                Background="#FFF1EEEE"
                ItemTemplate="{StaticResource itemsControlDataTemplete}" />
    

    总结

    数据模板有点类似于控件模板,但实际还是有本质上的区别的。通常情况下,控件是为自身目的而呈现的,并且不会反映基础数据.例如,Button不会绑定到业务对象,纯粹是在那里,因此可以单击它.但是,通常会出现ContentControl或ListBox,以便它们可以为用户显示数据。因此,DataTemplate用于为基础数据提供视觉结构,而ControlTemplate与基础数据无关,而只是为控件本身提供视觉布局。

    数据模板常用在3种类型的控件, 下图形式:

    img

    示例源代码

    源代码:https://github.com/luchong0813/WPFSeriesJobs/tree/master/4-WPFDataTemplete

  • 相关阅读:
    vue获取下拉框值
    vue子父组件通信
    内存堆栈问题
    Object.defineProperty()--数据劫持原理
    call和apply和bind的区别
    Object.create()和new object()和{}的区别
    Object.keys()/Object.values()的简单理解
    object.assign
    泛型的定义、使用
    ts 泛型
  • 原文地址:https://www.cnblogs.com/chonglu/p/14942762.html
Copyright © 2020-2023  润新知