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>

运行结果

相关推荐
时光追逐者3 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 61 期(2025年11.10-11.16)
c#·.net·.netcore
世洋Blog5 小时前
Unity面经-List底层原理、如何基于数组、如何扩容、List存储泛型、List有关在内存中的结构
unity·面试·c#·list
PfCoder6 小时前
C# async / await 用法以及和Task的关系
c#·多线程·winform·async、await
唐青枫10 小时前
.NET Web 应用 Linux 部署全指南:从环境搭建到生产上线
c#·.net
Charles_go20 小时前
41、C#什么是单例设计模式
java·设计模式·c#
夏霞20 小时前
c# ASP.NET Core SignalR 客户端与服务端自动重连配置指南
开发语言·c#·asp.net
Scout-leaf20 小时前
九成九新自用C#入门文档
c#
烛阴1 天前
隐式vs显式:解密C#类型转换的底层逻辑
前端·c#
梦里不知身是客111 天前
kafka作为Sink
c#·linq
猿来是你_L1 天前
C# Dictionary 转换成 List
windows·c#·list