WPF4 数据模板

数据模板

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

1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式。

2.针对列表类型的控件, 例如树形控件,下拉列表,列表控件, 可以修改其中的ItemTemplate。

3.修改ContentTemplate, 例UserControl控件的数据展现形式。

示例1:

定义一个ListBox

csharp 复制代码
<Grid>
    <ListBox x:Name="list"></ListBox>
</Grid>

点击查看代码,添加元素内容

csharp 复制代码
namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            for (int i = 0; i < 10; i++) 
            {
                list.Items.Add(new ListBoxItem()
                {
                    Content = new TextBlock()
                    {
                        Text = i.ToString()
                    }
                });
            }
        }
    }
}

运行结果:

添加色块

csharp 复制代码
    <Grid>
        <ListBox x:Name="list">
            <ListBoxItem>
                <StackPanel Orientation="Horizontal">
                    <Border Width="20" Height="20" Background="Red"/>
                    <TextBlock Margin="10,0" Text="red"/>
                </StackPanel>
            </ListBoxItem>
            <ListBoxItem>
                <StackPanel Orientation="Horizontal">
                    <Border Width="20" Height="20" Background="Red"/>
                    <TextBlock Margin="10,0" Text="red"/>
                </StackPanel>
            </ListBoxItem>
            <ListBoxItem>
                <StackPanel Orientation="Horizontal">
                    <Border Width="20" Height="20" Background="Red"/>
                    <TextBlock Margin="10,0" Text="red"/>
                </StackPanel>
            </ListBoxItem>
        </ListBox>
    </Grid>
</Window>

数据模板

我们希望定义一个数据模板,实现统一控制

csharp 复制代码
<Grid>
    <ListBox x:Name="list">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Border Width="20" Height="20" Background="Red"/>
                    <TextBlock Margin="10,0" Text="red"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

后台代码

csharp 复制代码
namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<int> test = new List<int>();

            for (int i = 0; i < 10; i++)
            {
                test.Add(i);
            }
            list.ItemsSource = test;   
        }
    }
}

运行结果

此时,所有生成的数据,都是使用的同一模板

绑定

csharp 复制代码
<Grid>
    <ListBox x:Name="list">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Border Width="20" Height="20" Background="{Binding Code}"/>
                    <TextBlock Margin="10,0" Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

后台代码

csharp 复制代码
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<color> test = new List<color>(); 
        test.Add(new color() { Code = "#FFB6C1",Name = "浅粉红" }); 
        test.Add(new color() { Code = "#FFCOCB",Name ="粉红"}); 
        test.Add(new color() { Code = "#DC143C", Name = "深红(猩红)" }); 
        test.Add(new color() { Code = "#FFF0F5", Name = "淡紫红" }); 
        list.ItemsSource = test;
     
    }

    public class color 
    {
        public string Code { get; set; }

        public string Name { get; set; }
    }
}

运行结果

数据来驱动UI显示

示例2

csharp 复制代码
<Grid>
    <!--AutoGenerateColumns自动生成改为FALSE 防止有多余的列-->
    <DataGrid x:Name="grid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Code}" Header="Code"/>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            <DataGridTextColumn  Header="操作"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

后台代码

csharp 复制代码
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<color> test = new List<color>(); 
        test.Add(new color() { Code = "#FFB6C1",Name = "浅粉红" }); 
        test.Add(new color() { Code = "#FFCOCB",Name ="粉红"}); 
        test.Add(new color() { Code = "#DC143C",Name = "深红(猩红)" }); 
        test.Add(new color() { Code = "#FFF0F5",Name = "淡紫红" });
        grid.ItemsSource = test;
     
    }

    public class color 
    {
        public string Code { get; set; }

        public string Name { get; set; }
    }
}

运行结果

在列中 放 按钮的情况

csharp 复制代码
<Grid>
    <!--AutoGenerateColumns自动生成改为FALSE 防止有多余的列-->
    <DataGrid x:Name="grid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Code}" Header="Code"/>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            
            <!--添加数据模板-->
            <DataGridTemplateColumn Header="操作">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Border Width="10" Height="10" Background="{Binding Code}"/>
                            <TextBox Margin="10,0" Text="{Binding Name}"/>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

运行结果

添加按钮

csharp 复制代码
<Grid>
    <!--AutoGenerateColumns自动生成改为FALSE 防止有多余的列-->
    <DataGrid x:Name="grid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Code}" Header="Code"/>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            
            <!--添加数据模板-->
            <DataGridTemplateColumn Header="操作">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <!--只允许有一个容器,所以需要一个容器包装多个按钮-->
                        <StackPanel Orientation="Horizontal">
                            <Button Content="删除"/>
                            <Button Content="复制"/>
                            <Button Content="保存"/>
                        </StackPanel>
                        <!--<StackPanel>
                            <Border Width="10" Height="10" Background="{Binding Code}"/>
                            <TextBox Margin="10,0" Text="{Binding Name}"/>
                        </StackPanel>-->
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

运行结果

相关推荐
林杜雨都6 小时前
Action和Func
开发语言·c#
工程师0076 小时前
TPL如何自动调整执行效率
c#·tpl
狮恒7 小时前
OpenHarmony Flutter 分布式数据管理:跨设备数据同步与一致性保障方案
分布式·flutter·wpf·openharmony
CreasyChan7 小时前
C# 反射详解
开发语言·前端·windows·unity·c#·游戏开发
c#上位机7 小时前
halcon求区域交集——intersection
图像处理·人工智能·计算机视觉·c#·halcon
布谷歌8 小时前
在java中实现c#的int.TryParse方法
java·开发语言·python·c#
Macbethad10 小时前
工业设备IO模拟程序
wpf
用户44884667106013 小时前
.NET进阶——深入理解Lambda表达式(2)手搓LINQ语句
c#·.net
狮恒14 小时前
OpenHarmony Flutter 分布式设备发现与连接:无感组网与设备协同管理方案
分布式·flutter·wpf·openharmony
云和数据.ChenGuang14 小时前
鸿蒙负一屏的技术定位与核心价值
华为·wpf·harmonyos