From 6c2e6bd4905743c11f3b119e64ef40bc7046a73d Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Thu, 3 Jul 2025 20:12:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BF=A1=E5=8F=B7=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E7=BB=91=E5=AE=9A=EF=BC=8C=E5=92=8C=E9=80=89?= =?UTF-8?q?=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Models/VariableData.cs | 13 +++- ViewModels/VariableTableViewModel.cs | 15 ++++ Views/VariableTableView.xaml | 107 +++++++++++++++++++++++---- Views/VariableTableView.xaml.cs | 69 ++++++++++++++++- 4 files changed, 185 insertions(+), 19 deletions(-) diff --git a/Models/VariableData.cs b/Models/VariableData.cs index 93e6c31..e4b6fe6 100644 --- a/Models/VariableData.cs +++ b/Models/VariableData.cs @@ -1,15 +1,17 @@ -using PMSWPF.Enums; +using CommunityToolkit.Mvvm.ComponentModel; +using PMSWPF.Enums; namespace PMSWPF.Models; /// /// 表示变量数据信息。 /// -public class VariableData +public partial class VariableData : ObservableObject { /// /// 报警的最大值阈值。 /// + public double AlarmMax { get; set; } /// @@ -62,6 +64,12 @@ public class VariableData /// public bool IsDeleted { get; set; } + /// + /// 指示变量是否已被修改了。 + /// + [ObservableProperty] + private bool isModified; + /// /// 指示是否需要保存变量数据。 /// @@ -111,4 +119,5 @@ public class VariableData /// 关联的变量表ID。 /// public int VariableTableId { get; set; } + } \ No newline at end of file diff --git a/ViewModels/VariableTableViewModel.cs b/ViewModels/VariableTableViewModel.cs index e400528..896cc34 100644 --- a/ViewModels/VariableTableViewModel.cs +++ b/ViewModels/VariableTableViewModel.cs @@ -1,9 +1,11 @@ using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Newtonsoft.Json; using NLog; using PMSWPF.Data.Repositories; using PMSWPF.Enums; +using PMSWPF.Extensions; using PMSWPF.Helper; using PMSWPF.Models; using PMSWPF.Services; @@ -23,6 +25,8 @@ partial class VariableTableViewModel : ViewModelBase [ObservableProperty] private ObservableCollection _dataVariables; + private ObservableCollection _originalDataVariables; + [ObservableProperty] private VariableData _selectedVariableData; @@ -50,6 +54,10 @@ partial class VariableTableViewModel : ViewModelBase if (VariableTable.DataVariables != null) { DataVariables = new ObservableCollection(VariableTable.DataVariables); + // 3. 创建原始数据的深拷贝备份 + // 推荐使用 JSON 序列化/反序列化进行深度拷贝 + var serialized = JsonConvert.SerializeObject(DataVariables); + _originalDataVariables = JsonConvert.DeserializeObject>(serialized); } @@ -113,6 +121,13 @@ partial class VariableTableViewModel : ViewModelBase } } + public void OnVarTableDataChanged(VariableData varData) + { + var originelData = _originalDataVariables.FirstOrDefault(d => d.Id == varData.Id); + + // varData.IsModified = originelData.Equals(varData); + // varData.IsModified = originelData.ValueEquals(varData); + } public async Task OnIsActiveChanged(bool active) { diff --git a/Views/VariableTableView.xaml b/Views/VariableTableView.xaml index e6d0d79..f10b85e 100644 --- a/Views/VariableTableView.xaml +++ b/Views/VariableTableView.xaml @@ -8,11 +8,20 @@ xmlns:vm="clr-namespace:PMSWPF.ViewModels" xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern" mc:Ignorable="d" + xmlns:vc="clr-namespace:PMSWPF.ValueConverts" + xmlns:ex="clr-namespace:PMSWPF.Extensions" + xmlns:en="clr-namespace:PMSWPF.Enums" Loaded="VariableTableView_OnLoaded" d:DataContext="{d:DesignInstance vm:VariableTableViewModel}" d:DesignHeight="600" d:DesignWidth="800"> + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Views/VariableTableView.xaml.cs b/Views/VariableTableView.xaml.cs index 649c791..2ed0389 100644 --- a/Views/VariableTableView.xaml.cs +++ b/Views/VariableTableView.xaml.cs @@ -1,16 +1,23 @@ using System.Windows; using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Media; using iNKORE.UI.WPF.Modern.Controls; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using NLog; +using PMSWPF.Enums; using PMSWPF.Helper; +using PMSWPF.Models; using PMSWPF.ViewModels; namespace PMSWPF.Views; public partial class VariableTableView : UserControl { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public bool IsLoadCompletion; + private VariableTableViewModel _viewModel; public VariableTableView() { @@ -23,7 +30,7 @@ public partial class VariableTableView : UserControl { try { - var _viewModel = (VariableTableViewModel)this.DataContext; + _viewModel = (VariableTableViewModel)this.DataContext; // 判断如果没有加载完成就跳过,防止ToggleSwtich加载的时候触发 if (!_viewModel.IsLoadCompletion || !IsLoadCompletion) return; @@ -41,4 +48,64 @@ public partial class VariableTableView : UserControl { IsLoadCompletion = true; } + + private void DataGrid_OnCellEditEnding(object? sender, DataGridCellEditEndingEventArgs args) + { + if (args.EditAction != DataGridEditAction.Commit) + return; + + try + { + // 获取到改变后的值和绑定的属性名 + VariableData varData = (VariableData)args.Row.Item; + var element = args.EditingElement; + object newValue = null; + string bindingPath = ""; + + if (element is TextBox textBox) + { + newValue = textBox.Text; + DataGridTextColumn textColumn = (DataGridTextColumn)args.Column; + bindingPath = (textColumn.Binding as Binding)?.Path.Path; + } + else if (element is CheckBox checkBox) + { + newValue = checkBox.IsChecked; + DataGridCheckBoxColumn checkBoxColumn = (DataGridCheckBoxColumn)args.Column; + bindingPath = (checkBoxColumn.Binding as Binding)?.Path.Path; + } + else if (args.Column.Header.ToString() == "信号类型") + { + var comboBox = VisualTreeHelper.GetChild(element, 0) as ComboBox; + if (comboBox != null) + { + newValue = comboBox.SelectedItem; + bindingPath = "SignalType"; + } + } + else + { + return; + } + + if (newValue == null || string.IsNullOrEmpty(bindingPath)) + return; + // 通过反射拿到值 + var pathPropertyInfo = varData.GetType() + .GetProperty(bindingPath); + var oldValue = pathPropertyInfo.GetValue(varData); + // 判断值是否相等 + if (newValue.ToString() != oldValue?.ToString()) + { + varData.IsModified = true; + } + + } + catch (Exception e) + { + string msg = "编辑变量表数据时发生了错误:"; + Logger.Error(msg + e); + NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error); + } + } } \ No newline at end of file