WPF 用户控件 DataTemplate 数据模板绑定 Binding
ListBox 的列表绑定远远不能满足我们实际工作中的需求,出于对灵活性、复用性以及代码精简的考虑,需要保证循环列表中的单个元素是独立的元素片段,类似Web中的局部视图。 这时候,使用用户控件会好很多。
DataTemplate:FruitInfoDT.xaml
<UserControl x:Class="MyUILib.FruitInfoDT"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type StackPanel}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="5"></RotateTransform>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="#3B9CFB" />
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<StackPanel Orientation="Vertical" Margin="10">
<Image Source="{Binding Img}" Width="96" Height="96" />
<TextBlock HorizontalAlignment="Center" Foreground="White" Text="{Binding Info}"/>
</StackPanel>
</Grid>
</UserControl>
XAML:
<Window.DataContext>
<local:VMTempTest/>
</Window.DataContext>
<StackPanel Margin="10,0,0,50" Orientation="Vertical" >
<TextBlock Text="用户控件模板列表" FontWeight="Bold" Margin="0,5,0,5" ></TextBlock>
<StackPanel HorizontalAlignment="Left" >
<ItemsControl ItemsSource="{Binding FiList}" HorizontalAlignment="Left" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:FruitInfoDT />
</DataTemplate>
</ItemsControl.ItemTemplate>
<!-- 面板显示模板 -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal">
</WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>
</StackPanel>
Models:
public class FruitInfoViewModel : ObservableObject
{
private String img;
/// <summary>
/// 图片
/// </summary>
public String Img
{
get { return img; }
set { img = value; RaisePropertyChanged(() => Img); }
}
private String info;
/// <summary>
/// 信息
/// </summary>
public String Info
{
get { return info; }
set { info = value; RaisePropertyChanged(() => Info); }
}
}
ViewModel:
public class VMTempTest : ViewModelBase
{
public VMTempTest()
{
FiList = new ObservableCollection<FruitInfoViewModel>() {
new FruitInfoViewModel{ Img = "/MyWpfApp;component/Images/1.jpg", Info= "樱桃"},
new FruitInfoViewModel{ Img = "/MyWpfApp;component/Images/2.jpg", Info = "葡萄"}
};
}
private ObservableCollection<FruitInfoViewModel> fiList;
/// <summary>
/// 用户控件模板列表
/// </summary>
public ObservableCollection<FruitInfoViewModel> FiList
{
get { return fiList; }
set { fiList = value; RaisePropertyChanged(() => FiList); }
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了