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

WPF DataGrid中特定条件下将带ComboBox的单元格设为只读的实现方法

解决方案

共有两种符合需求的实现方式,均是在进入单元格编辑模式前完成拦截,不会触发编辑模板加载,完全保持只读状态:

方案1:处理BeginningEdit事件(实现最简单)

DataGrid的BeginningEdit事件会在单元格进入编辑模式前触发,直接在该事件中判断对应行的集合是否为空,为空则取消编辑操作:

  1. 先在XAML中给DataGrid添加事件绑定:
<DataGrid 
    AutoGenerateColumns="True"
    AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"
    BeginningEdit="DataGrid_BeginningEdit">
  1. 编写事件逻辑:
private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    // 仅处理目标列,可根据实际列标识调整判断逻辑
    if (e.Column.Header?.ToString() != "First") return;
    
    // 获取当前行绑定的数据项,替换为你实际的实体类类型
    var dataItem = e.Row.Item as YourEntityType;
    if (dataItem == null) return;
    
    // 集合为空/Null时取消编辑
    // 如果你实际的集合属性名是Value(和ComboBox的ItemsSource绑定一致),此处替换为Value即可
    if (dataItem.Values == null || !dataItem.Values.Any())
    {
        e.Cancel = true;
    }
}

如果需要严格遵循MVVM模式避免后台代码,可使用MVVM框架的EventToCommand功能,将该事件绑定到ViewModel的命令中处理即可。

方案2:通过CellStyle绑定只读属性(无事件代码)

直接在生成模板列时,给单元格添加数据触发器,自动根据集合状态设置只读属性:
修改AutoGeneratingColumn中的代码,给templateColumn添加CellStyle:

if (e.PropertyName == "First")
{
    var templateColumn = new DataGridTemplateColumn
    {
        Header = e.PropertyName,
        CellTemplate = (sender as FrameworkElement).FindResource("ValuesCellTemplate") as DataTemplate,
        CellEditingTemplate = (sender as FrameworkElement).FindResource("ValuesCellEditingTemplate") as DataTemplate,
        // 新增单元格样式
        CellStyle = new Style(typeof(DataGridCell))
        {
            Triggers = 
            {
                new DataTrigger
                {
                    Binding = new Binding("Values"), // 替换为你实际的集合属性名
                    Value = null,
                    Setters = { new Setter(DataGridCell.IsReadOnlyProperty, true) }
                },
                new DataTrigger
                {
                    Binding = new Binding("Values.Count"), // 替换为你实际的集合属性名
                    Value = 0,
                    Setters = { new Setter(DataGridCell.IsReadOnlyProperty, true) }
                }
            }
        }
    };
    e.Column = templateColumn;
}

该方案无需额外处理事件,运行时会自动判断每一行的集合状态,为空时直接将单元格设为只读,无法触发编辑操作。


内容的提问来源于stack exchange,提问作者Melissa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:06:01