You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字符串和加载方式存在几个问题,导致程序崩溃:

  1. 命名空间或绑定写法不符合WinUI3规范;
  2. 手动转义字符容易出错,且MemoryStream加载方式可能引发编码问题;
  3. 冗余的绑定属性可能导致解析失败。

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:25:52