DataTemplate用于为CollectionView或ListView项定义自定义UI外观,通过ItemTemplate绑定数据并用{Binding}显示属性,支持内联/资源字典定义、DataTemplateSelector多模板切换及性能优化。

MAUI 中的 DataTemplate 主要用于为 CollectionView 或 ListView 的每一项定义自定义外观,核心是把数据对象“可视化”成你想要的 UI 结构。
用 DataTemplate 包裹你的自定义布局
最常用方式是在 CollectionView 里通过 ItemTemplate 设置一个 DataTemplate,里面写 XAML 布局(比如 Grid、StackLayout),再用绑定语法 {Binding PropertyName} 显示数据字段。
- 确保集合绑定源(如
ItemsSource="{Binding Items}")是IEnumerable类型,且T的属性有 get 访问器 -
DataTemplate内部的控件直接绑定到数据项的属性,不需要加DataContext或Source - 支持静态资源引用,比如复用
Style或ControlTemplate
内联模板 vs 资源字典模板
简单场景可直接在 ItemTemplate 里写布局;复杂或复用场景建议提成资源:
- 内联写法:在
CollectionView标签下直接嵌套DataTemplate和子控件 - 资源写法:在
ResourceDictionary中定义DataTemplate并设x:Key,再用ItemTemplate="{StaticResource MyTemplate}"引用 - 资源方式更利于维护和跨页面复用,也支持主题切换时动态替换
用 DataTemplateSelector 实现多类型模板
当列表中数据类型不同(比如消息列表含文本、图片、链接),可用 DataTemplateSelector 动态选模板:
- 新建类继承
DataTemplateSelector,重写OnSelectTemplate方法 - 根据传入的
item类型或属性值返回对应DataTemplate对象 - 在 XAML 中把该选择器赋给
CollectionView.ItemTemplate(不是模板本身)
注意绑定上下文和性能细节
DataTemplate 每次渲染都会创建新实例,所以避免在模板里写耗时逻辑或重复初始化:
- 图片路径绑定推荐用
UriImageSource或缓存过的ImageSource,别在OnBindingContextChanged里反复 new - 如果需要响应点击,优先用
TapGestureRecognizer绑定命令,而不是写后台代码找控件 - 调试时可临时加
BackgroundColor="LightBlue"看模板是否生效、是否被裁剪
基本上就这些。DataTemplate 不复杂但容易忽略绑定路径和生命周期,写完记得跑真机看看滚动是否流畅。










