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("数据保存成功!");
    }
}
相关推荐
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
listening77716 小时前
HarmonyOS 6.1 全场景协同实战:从“单机”到“超级终端”的分布式重构
wpf
心平气和量大福大1 天前
C#-WPF-布局-Grid
c#·wpf·visual studio
心平气和量大福大2 天前
C#-WPF-Window主窗体
开发语言·c#·wpf
FuckPatience3 天前
Telerik UI for WPF 值不能为null。参数名:key
ui·wpf
lindexi3 天前
WPF 笔迹延迟优化从硬件到软件的全链路分析
wpf
weixin_727535624 天前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf
liuxiaowei34 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf
贺国亚5 天前
模型训练-分布式与GPU调度
分布式·wpf
不羁的木木5 天前
HarmonyOS技术精讲-Connectivity Kit:实战——多屏协同与文件快传应用
华为·wpf·harmonyos