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>

运行结果

相关推荐
敲代码的 蜡笔小新2 小时前
【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
unity·设计模式·c#·访问者模式
明耀3 小时前
WPF C# 用WebView加载H5页面(uniapp项目,vue项目)
uni-app·c#·wpf
我不是程序猿儿7 小时前
【C#】 lock 关键字
java·开发语言·c#
动感光博11 小时前
Unity序列化字段、单例模式(Singleton Pattern)
unity·单例模式·c#
黑洞视界12 小时前
NCC Mocha v0.2.0 发布, 新增对 Metrics 的支持
c#·.net·可观测性·observability
FAREWELL0007513 小时前
Unity基础学习(十五)核心系统——音效系统
学习·unity·c#·游戏引擎
zimoyin14 小时前
Java 快速转 C# 教程
java·开发语言·c#
向宇it14 小时前
【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展
开发语言·ui·unity·c#·编辑器·游戏引擎
动感光博14 小时前
Unity碰撞检测(射线投射、胶囊体投射)、交互(图层、掩码)
unity·c#·游戏引擎·游戏程序·动画