1. 从入门到进阶:为什么需要MVVM与数据绑定?
如果你已经跟着入门教程,在WinUI3项目里成功用上了CommunityToolkit的DataGrid控件,看着表格数据唰地一下显示出来,还能用鼠标拖拽列宽、用方向键切换单元格,心里肯定挺有成就感。但不知道你有没有遇到过这样的场景:用户点击了一个“刷新”按钮,你吭哧吭哧地在后台代码里找到那个dataGrid对象,然后重新给它赋了一个新的ItemsSource。或者,当用户在某一行数据上双击编辑后,你发现表格里的数据并没有自动更新,还得手动去刷新整个数据源。
这些“小麻烦”在简单的Demo里或许还能忍受,但一旦项目变得复杂,比如表格数据来自网络API、需要频繁更新、或者用户交互逻辑变多时,这种直接在UI后台代码里操作控件的方式就会让代码变得难以维护。这时候,就该MVVM模式和强大的数据绑定登场了。它们就像是给你的UI和数据之间铺设了一条双向高速公路,数据一有变化,UI自动更新;用户在UI上的操作,也能自动反馈到数据上。你不再需要像个“传话筒”一样,在UI和业务逻辑之间来回奔波手动同步状态。
我刚开始用WPF和后来的WinUI时,也总想着偷懒,觉得直接操作控件多直接啊。但踩过几次坑之后就明白了,尤其是在处理像DataGrid这种功能复杂的控件时,拥抱MVVM和数据绑定,长远来看是最高效、最不容易出错的路径。这篇文章,我就结合自己实战中的经验,带你深入WinUI3 DataGrid的数据绑定与动态更新,让你能轻松驾驭这个强大的表格控件。
2. 夯实基础:理解DataGrid的核心绑定属性
在深入动态更新之前,我们必须把DataGrid绑定的基础打牢。很多朋友卡在数据不显示或者更新无效的问题上,根源往往是对几个核心属性的理解有偏差。
2.1 ItemsSource:数据绑定的生命线
ItemsSource是DataGrid显示数据的根本。它期望一个实现了IEnumerable接口的集合,比如我们最常用的ObservableCollection<T>。这里有个新手常踩的坑:直接绑定一个List<T>。
// 这是一个常见的错误做法,虽然第一次能显示,但后续更新无效
public List<Person> PeopleList { get; set; } = new List<Person>();
// 在XAML中绑定:ItemsSource="{x:Bind PeopleList}"
List<T>本身不提供集合变化通知。当你往PeopleList里Add一个新对象时,DataGrid根本不知道,所以界面不会刷新。正确的做法是使用ObservableCollection<T>:
// 正确的做法:使用可通知的集合
public ObservableCollection<Person> People { get; set; } = new ObservableCollection<Person>();
// 在XAML中绑定:ItemsSource="{x:Bind People, Mode=OneWay}"
ObservableCollection<T>实现了INotifyCollectionChanged接口,任何增、删、移、清空集合的操作,都会自动触发UI更新。这是实现动态列表更新的基石。
2.2 AutoGenerateColumns 与 自定义列
入门时我们图省事,会设置AutoGenerateColumns="True",让DataGrid根据数据对象的公共属性自动生成列。这在快速原型阶段非常方便。
<controls:DataGrid x:Name="MainDataGrid"
ItemsSource="{x:Bind ViewModel.People, Mode=OneWay}"
AutoGenerateColumns="True"/>
但到了实际项目,你很快会发现自动生成的列可能不是你想要的:列顺序不可控、列标题是属性名(不友好)、某些复杂类型(如图片、按钮)无法正确显示。这时就需要关闭自动生成,手动定义每一列。
<controls:DataGrid x:Name="MainDataGrid"
ItemsSource="{x:Bind ViewModel.People, Mode=OneWay}"
AutoGenerateColumns="False">
<controls:DataGrid.Columns>
<!-- 文本列 -->
<controls:DataGridTextColumn Header="姓名" Binding="{Binding Name}" Width="*"/>
<!-- 数字列,可以设置格式 -->
<controls:DataGridTextColumn Header="年龄" Binding="{Binding Age}">
<controls:DataGridTextColumn.Binding>
<Binding Path="Age" StringFormat="{}{0}岁"/>
</controls:DataGridTextColumn.Binding>
</controls:DataGridTextColumn>
<!-- 复选框列,用于布尔值 -->
<controls:DataGridCheckBoxColumn Header="在职" Binding="{Binding IsEmployed}"/>
<!-- 模板列,用于自定义显示,比如放一个按钮 -->
<controls:DataGridTemplateColumn Header="操作">
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="local:Person">
<Button Content="详情"


215

被折叠的 条评论
为什么被折叠?



