WINUI3中如何通过C#向DataGrid的DataTemplate添加CheckBox
WinUI3中用C#为DataGrid动态添加带CheckBox的模板列
一、纯C#代码构建DataTemplate
在WinUI3里,直接创建DataTemplate后不能直接添加控件实例——因为DataTemplate是模板,要通过FrameworkElementFactory来定义模板内的元素结构(该API虽标记过时,但Win10兼容场景下仍可用)。
替换你原代码中注释部分的逻辑,修改后完整代码:
private void CreateDataTableForBowlers() { allBowlers.Columns.Clear(); DataGridTextColumn column = new DataGridTextColumn() { Header = "Name", Binding = new Binding() { Path = new PropertyPath("Name") } }; column.FontSize = 10; DataGridTemplateColumn dataGridTemplateColumn = new(); dataGridTemplateColumn.Header = "Select Two"; // 创建DataTemplate并定义内部CheckBox DataTemplate dataTemplate = new DataTemplate(typeof(CheckBox)); FrameworkElementFactory checkBoxFactory = new FrameworkElementFactory(typeof(CheckBox)); // 设置双向绑定 checkBoxFactory.SetBinding(CheckBox.IsCheckedProperty, new Binding() { Path = new PropertyPath("isBowling"), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }); // 绑定Checked事件(按需添加) checkBoxFactory.AddHandler(CheckBox.CheckedEvent, new RoutedEventHandler(CheckBox_Checked)); dataTemplate.VisualTree = checkBoxFactory; dataGridTemplateColumn.CellTemplate = dataTemplate; allBowlers.Columns.Add(dataGridTemplateColumn); allBowlers.Columns.Add(column); } // 对应的Checked事件处理方法 private void CheckBox_Checked(object sender, RoutedEventArgs e) { // 这里写你的事件逻辑 }
二、修复XamlReader加载崩溃问题
你之前的XAML字符串和加载方式存在几个问题,导致程序崩溃:
- 命名空间或绑定写法不符合WinUI3规范;
- 手动转义字符容易出错,且MemoryStream加载方式可能引发编码问题;
- 冗余的绑定属性可能导致解析失败。
修改后的完整代码:
private void CreateDataTableForBowlers() { allBowlers.Columns.Clear(); DataGridTextColumn column = new DataGridTextColumn() { Header = "Name", Binding = new Binding() { Path = new PropertyPath("Name") } }; column.FontSize = 10; DataGridTemplateColumn dataGridTemplateColumn = new(); dataGridTemplateColumn.Header = "Select Two"; // 用逐字字符串定义XAML,避免转义错误 string xaml = @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> <CheckBox IsChecked='{Binding isBowling, Mode=TwoWay}' Checked='CheckBox_Checked' /> </DataTemplate>"; // 用StringReader加载XAML,更可靠 using var stringReader = new StringReader(xaml); using var xmlReader = XmlReader.Create(stringReader); var dataTemplate = XamlReader.Load(xmlReader) as DataTemplate; dataGridTemplateColumn.CellTemplate = dataTemplate; allBowlers.Columns.Add(dataGridTemplateColumn); allBowlers.Columns.Add(column); } // 对应的Checked事件处理方法 private void CheckBox_Checked(object sender, RoutedEventArgs e) { // 这里写你的事件逻辑 }
关键修复细节:
- 用
@定义逐字字符串,不用手动转义<和>; - 移除了
UpdateSourceTrigger=PropertyChanged,WinUI3中CheckBox的IsChecked绑定默认会实时更新数据源; - 改用
StringReader+XmlReader加载XAML,避免编码错误; - 确保绑定的属性名
isBowling和你的数据源属性完全一致(注意大小写)。
内容的提问来源于stack exchange,提问作者user14892417
相关产品推荐
相关产品推荐

