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