完成信号类型的绑定,和选择

This commit is contained in:
2025-07-03 20:12:07 +08:00
parent 33fd86db41
commit 6c2e6bd490
4 changed files with 185 additions and 19 deletions

View File

@@ -1,15 +1,17 @@
using PMSWPF.Enums; using CommunityToolkit.Mvvm.ComponentModel;
using PMSWPF.Enums;
namespace PMSWPF.Models; namespace PMSWPF.Models;
/// <summary> /// <summary>
/// 表示变量数据信息。 /// 表示变量数据信息。
/// </summary> /// </summary>
public class VariableData public partial class VariableData : ObservableObject
{ {
/// <summary> /// <summary>
/// 报警的最大值阈值。 /// 报警的最大值阈值。
/// </summary> /// </summary>
public double AlarmMax { get; set; } public double AlarmMax { get; set; }
/// <summary> /// <summary>
@@ -62,6 +64,12 @@ public class VariableData
/// </summary> /// </summary>
public bool IsDeleted { get; set; } public bool IsDeleted { get; set; }
/// <summary>
/// 指示变量是否已被修改了。
/// </summary>
[ObservableProperty]
private bool isModified;
/// <summary> /// <summary>
/// 指示是否需要保存变量数据。 /// 指示是否需要保存变量数据。
/// </summary> /// </summary>
@@ -111,4 +119,5 @@ public class VariableData
/// 关联的变量表ID。 /// 关联的变量表ID。
/// </summary> /// </summary>
public int VariableTableId { get; set; } public int VariableTableId { get; set; }
} }

View File

@@ -1,9 +1,11 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Newtonsoft.Json;
using NLog; using NLog;
using PMSWPF.Data.Repositories; using PMSWPF.Data.Repositories;
using PMSWPF.Enums; using PMSWPF.Enums;
using PMSWPF.Extensions;
using PMSWPF.Helper; using PMSWPF.Helper;
using PMSWPF.Models; using PMSWPF.Models;
using PMSWPF.Services; using PMSWPF.Services;
@@ -23,6 +25,8 @@ partial class VariableTableViewModel : ViewModelBase
[ObservableProperty] [ObservableProperty]
private ObservableCollection<VariableData> _dataVariables; private ObservableCollection<VariableData> _dataVariables;
private ObservableCollection<VariableData> _originalDataVariables;
[ObservableProperty] [ObservableProperty]
private VariableData _selectedVariableData; private VariableData _selectedVariableData;
@@ -50,6 +54,10 @@ partial class VariableTableViewModel : ViewModelBase
if (VariableTable.DataVariables != null) if (VariableTable.DataVariables != null)
{ {
DataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables); DataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables);
// 3. 创建原始数据的深拷贝备份
// 推荐使用 JSON 序列化/反序列化进行深度拷贝
var serialized = JsonConvert.SerializeObject(DataVariables);
_originalDataVariables = JsonConvert.DeserializeObject<ObservableCollection<VariableData>>(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) public async Task OnIsActiveChanged(bool active)
{ {

View File

@@ -8,11 +8,20 @@
xmlns:vm="clr-namespace:PMSWPF.ViewModels" xmlns:vm="clr-namespace:PMSWPF.ViewModels"
xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern"
mc:Ignorable="d" mc:Ignorable="d"
xmlns:vc="clr-namespace:PMSWPF.ValueConverts"
xmlns:ex="clr-namespace:PMSWPF.Extensions"
xmlns:en="clr-namespace:PMSWPF.Enums"
Loaded="VariableTableView_OnLoaded" Loaded="VariableTableView_OnLoaded"
d:DataContext="{d:DesignInstance vm:VariableTableViewModel}" d:DataContext="{d:DesignInstance vm:VariableTableViewModel}"
d:DesignHeight="600" d:DesignHeight="600"
d:DesignWidth="800"> d:DesignWidth="800">
<UserControl.Resources> <UserControl.Resources>
<ex:EnumBindingSource x:Key="signalType"
EnumType="{x:Type en:SignalType}" />
<ex:EnumBindingSource x:Key="protocolType"
EnumType="{x:Type en:ProtocolType}" />
<vc:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
<!-- 标签字体的样式 --> <!-- 标签字体的样式 -->
<Style TargetType="TextBlock" <Style TargetType="TextBlock"
x:Key="VarTableLabelStyle"> x:Key="VarTableLabelStyle">
@@ -101,27 +110,93 @@
</ikw:SimpleStackPanel> </ikw:SimpleStackPanel>
<DataGrid Margin="10" <DataGrid Margin="10"
CellEditEnding="DataGrid_OnCellEditEnding"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserSortColumns="True" CanUserSortColumns="True"
SelectedItem="{Binding SelectedVariableData}" SelectedItem="{Binding SelectedVariableData}"
ItemsSource="{Binding DataVariables}"> ItemsSource="{Binding DataVariables}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<!-- <Setter Property="Background" Value="#fff"/> -->
<Style.Triggers>
<DataTrigger Binding="{Binding IsModified}"
Value="True">
<Setter Property="Background"
Value="Pink" />
<Setter Property="Foreground"
Value="#000" />
<Setter Property="FontWeight"
Value="Bold" />
</DataTrigger>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Background"
Value="LightBlue" />
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Background"
Value="DodgerBlue" />
<Setter Property="Foreground"
Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="名称"
<DataGridTextColumn Header="描述" Binding="{Binding Description}" /> Binding="{Binding Name}" />
<DataGridTextColumn Header="节点ID" Binding="{Binding NodeId}" /> <DataGridTextColumn Header="描述"
<DataGridTextColumn Header="协议类型" Binding="{Binding ProtocolType}" /> Binding="{Binding Description}" />
<DataGridTextColumn Header="数据类型" Binding="{Binding DataType}" /> <DataGridTextColumn IsReadOnly="True"
<DataGridTextColumn Header="信号类型" Binding="{Binding SignalType}" /> Header="节点ID"
<DataGridTextColumn Header="当前值" Binding="{Binding DataValue}" /> Binding="{Binding NodeId}" />
<DataGridTextColumn Header="显示值" Binding="{Binding DisplayValue}" /> <DataGridTextColumn IsReadOnly="True"
<DataGridTextColumn Header="更新时间" Binding="{Binding UpdateTime}" /> Header="协议类型"
<DataGridTextColumn Header="转换规则" Binding="{Binding Converstion}" /> Binding="{Binding ProtocolType}" />
<DataGridCheckBoxColumn Header="启用" Binding="{Binding IsActive}" /> <DataGridTextColumn IsReadOnly="True"
<DataGridCheckBoxColumn Header="保存" Binding="{Binding IsSave}" /> Header="数据类型"
<DataGridTextColumn Header="保存范围" Binding="{Binding SaveRange}" /> Binding="{Binding DataType}" />
<DataGridCheckBoxColumn Header="报警" Binding="{Binding IsAlarm}" /> <DataGridTemplateColumn Header="信号类型">
<DataGridTextColumn Header="报警最小值" Binding="{Binding AlarmMin}" /> <DataGridTemplateColumn.CellTemplate>
<DataGridTextColumn Header="报警最大值" Binding="{Binding AlarmMax}" /> <DataTemplate>
<TextBlock Text="{Binding SignalType, Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Source={StaticResource signalType}}"
SelectedItem="{Binding SignalType}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn IsReadOnly="True"
Header="当前值"
Binding="{Binding DataValue}" />
<DataGridTextColumn IsReadOnly="True"
Header="显示值"
Binding="{Binding DisplayValue}" />
<DataGridTextColumn IsReadOnly="True"
Header="更新时间"
Binding="{Binding UpdateTime}" />
<DataGridTextColumn Header="转换规则"
Binding="{Binding Converstion}" />
<DataGridCheckBoxColumn Header="启用"
Binding="{Binding IsActive}" />
<DataGridCheckBoxColumn Header="保存"
Binding="{Binding IsSave}" />
<DataGridTextColumn Header="保存范围"
Binding="{Binding SaveRange}" />
<DataGridCheckBoxColumn Header="报警"
Binding="{Binding IsAlarm}" />
<DataGridTextColumn Header="报警最小值"
Binding="{Binding AlarmMin}" />
<DataGridTextColumn Header="报警最大值"
Binding="{Binding AlarmMax}" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</DockPanel> </DockPanel>

View File

@@ -1,16 +1,23 @@
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using iNKORE.UI.WPF.Modern.Controls; using iNKORE.UI.WPF.Modern.Controls;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using NLog;
using PMSWPF.Enums;
using PMSWPF.Helper; using PMSWPF.Helper;
using PMSWPF.Models;
using PMSWPF.ViewModels; using PMSWPF.ViewModels;
namespace PMSWPF.Views; namespace PMSWPF.Views;
public partial class VariableTableView : UserControl public partial class VariableTableView : UserControl
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public bool IsLoadCompletion; public bool IsLoadCompletion;
private VariableTableViewModel _viewModel;
public VariableTableView() public VariableTableView()
{ {
@@ -23,7 +30,7 @@ public partial class VariableTableView : UserControl
{ {
try try
{ {
var _viewModel = (VariableTableViewModel)this.DataContext; _viewModel = (VariableTableViewModel)this.DataContext;
// 判断如果没有加载完成就跳过防止ToggleSwtich加载的时候触发 // 判断如果没有加载完成就跳过防止ToggleSwtich加载的时候触发
if (!_viewModel.IsLoadCompletion || !IsLoadCompletion) if (!_viewModel.IsLoadCompletion || !IsLoadCompletion)
return; return;
@@ -41,4 +48,64 @@ public partial class VariableTableView : UserControl
{ {
IsLoadCompletion = true; 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);
}
}
} }