WPF DataGrid 指定列的数据可以编辑功能开发

需求:

如上图所示。最后两列的数据可以修改。在MVVM框架中还是很好实现的。

1.DataGrid 的数据源是用对应的ObservableCollection 的集合绑定。

2.修改要编辑列数据的列模板

复制代码
<DataGridTemplateColumn Width="120" Header="VernierOverlayX" HeaderStyle="{StaticResource ColumnHeaderStyle}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <hc:NumericUpDown HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="True" ValueFormat="N6" Value="{Binding VernierOverlayXInput, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="120" Header="VernierOverlayY" HeaderStyle="{StaticResource ColumnHeaderStyle}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <hc:NumericUpDown HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="True" ValueFormat="N6" Value="{Binding VernierOverlayYInput, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

关键功能说明

1. NumericUpDown 限制规则

  • ValueFormat="N6"最多保留 6 位小数
  • Value="{Binding ..., UpdateSourceTrigger=PropertyChanged}" → 输入实时同步到数据源
  • 自动限制只能输入数字 / 小数点,无法输入文字
  • 支持正负 float 数值

2. 实体类要求(ViewModel 绑定模型)

确保你的 TestResultDetail 模型里这两个字段是 float / double 类型:

复制代码
private float _vernierOverlayXInput;
/// <summary>
/// (用户从UI端输入)
/// </summary>
[MfFieldIgnore]
public float VernierOverlayXInput
{
    get => _vernierOverlayXInput;
    set
    {
        _vernierOverlayXInput = value;
        OnPropertyChanged();
    }
}

private float _vernierOverlayYInput;
/// <summary>
/// (用户从UI端输入)
/// </summary>
[MfFieldIgnore]
public float VernierOverlayYInput
{
    get => _vernierOverlayYInput;
    set
    {
        _vernierOverlayYInput = value;
        OnPropertyChanged();
    }
}

3. 保存功能实现(ViewModel 代码)

复制代码
using Microsoft.Toolkit.Mvvm;
using Microsoft.Toolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;

public class MainViewModel : ObservableObject
{
    // 绑定列表
    public ObservableCollection<TestResultDetail> TestResultDetailList { get; set; } = new();

    // 保存命令
    public IRelayCommand SaveDataCommand { get; }

    public MainViewModel()
    {
        // 初始化保存命令
        SaveDataCommand = new RelayCommand(SaveDataToFile);
    }

    // 保存逻辑(可改成保存到数据库/JSON/CSV)
    private void SaveDataToFile()
    {
        StringBuilder sb = new();
        // 写入表头
        sb.AppendLine("ShotPosition,PointPosition,TestNumber,X0,Y0,X180,Y180,TisX,TisY,CorrectionX,CorrectionY,VernierOverlayX,VernierOverlayY");
        
        // 写入每一行数据
        foreach (var item in TestResultDetailList)
        {
            sb.AppendLine($"{item.ShotData},{item.PointPosData},{item.TestNumber},{item.X0},{item.Y0},{item.X180},{item.Y180},{item.TisX},{item.TisY},{item.CorrectionX},{item.CorrectionY},{item.VernierOverlayX},{item.VernierOverlayY}");
        }

        // 保存到 CSV 文件
        File.WriteAllText("TestResultData.csv", sb.ToString(), Encoding.UTF8);

        // 提示保存成功(可替换为 MessageBox)
        Console.WriteLine("数据保存成功!");
    }
}
相关推荐
武藤一雄2 天前
WPF中逻辑树(Logical Tree)与可视化树(Visual Tree)到底是什么
microsoft·c#·.net·wpf·.netcore
炸炸鱼.2 天前
ELK 企业级日志分析系统完整部署手册
elk·wpf
Mr_pyx3 天前
微服务可观测性实战:分布式链路追踪从入门到精通
wpf
c#上位机4 天前
wpf附加事件
wpf
玖笙&4 天前
✨WPF编程进阶【9.1】:WPF资源完全指南(附源码)
c++·c#·wpf·visual studio
想你依然心痛4 天前
HarmonyOS 6(API 23)分布式实战:基于悬浮导航与沉浸光感的“光影协创“跨设备白板系统
分布式·wpf·harmonyos·悬浮导航·沉浸光感
c#上位机5 天前
wpf路由事件
wpf
nashane6 天前
HarmonyOS 鸿蒙 2026 全栈实战:从手势驱动到分布式数据落地的完整架构
wpf·harmony app
秋雨雁南飞6 天前
WPF 国际化(全球化)管理
wpf
nashane7 天前
HarmonyOS 6.0 分布式数据库进阶:设备协同与高效数据同步实战(API 11 Stage 模型)
wpf·harmonyos 5