完成信号类型的绑定,和选择
This commit is contained in:
@@ -1,15 +1,17 @@
|
||||
using PMSWPF.Enums;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using PMSWPF.Enums;
|
||||
|
||||
namespace PMSWPF.Models;
|
||||
|
||||
/// <summary>
|
||||
/// 表示变量数据信息。
|
||||
/// </summary>
|
||||
public class VariableData
|
||||
public partial class VariableData : ObservableObject
|
||||
{
|
||||
/// <summary>
|
||||
/// 报警的最大值阈值。
|
||||
/// </summary>
|
||||
|
||||
public double AlarmMax { get; set; }
|
||||
|
||||
/// <summary>
|
||||
@@ -62,6 +64,12 @@ public class VariableData
|
||||
/// </summary>
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指示变量是否已被修改了。
|
||||
/// </summary>
|
||||
[ObservableProperty]
|
||||
private bool isModified;
|
||||
|
||||
/// <summary>
|
||||
/// 指示是否需要保存变量数据。
|
||||
/// </summary>
|
||||
@@ -111,4 +119,5 @@ public class VariableData
|
||||
/// 关联的变量表ID。
|
||||
/// </summary>
|
||||
public int VariableTableId { get; set; }
|
||||
|
||||
}
|
||||
@@ -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<VariableData> _dataVariables;
|
||||
|
||||
private ObservableCollection<VariableData> _originalDataVariables;
|
||||
|
||||
[ObservableProperty]
|
||||
private VariableData _selectedVariableData;
|
||||
|
||||
@@ -50,6 +54,10 @@ partial class VariableTableViewModel : ViewModelBase
|
||||
if (VariableTable.DataVariables != null)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -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">
|
||||
<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"
|
||||
x:Key="VarTableLabelStyle">
|
||||
@@ -101,27 +110,93 @@
|
||||
</ikw:SimpleStackPanel>
|
||||
|
||||
<DataGrid Margin="10"
|
||||
CellEditEnding="DataGrid_OnCellEditEnding"
|
||||
AutoGenerateColumns="False"
|
||||
CanUserSortColumns="True"
|
||||
SelectedItem="{Binding SelectedVariableData}"
|
||||
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>
|
||||
<DataGridTextColumn Header="名称" Binding="{Binding Name}" />
|
||||
<DataGridTextColumn Header="描述" Binding="{Binding Description}" />
|
||||
<DataGridTextColumn Header="节点ID" Binding="{Binding NodeId}" />
|
||||
<DataGridTextColumn Header="协议类型" Binding="{Binding ProtocolType}" />
|
||||
<DataGridTextColumn Header="数据类型" Binding="{Binding DataType}" />
|
||||
<DataGridTextColumn Header="信号类型" Binding="{Binding SignalType}" />
|
||||
<DataGridTextColumn Header="当前值" Binding="{Binding DataValue}" />
|
||||
<DataGridTextColumn Header="显示值" Binding="{Binding DisplayValue}" />
|
||||
<DataGridTextColumn 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}" />
|
||||
<DataGridTextColumn Header="名称"
|
||||
Binding="{Binding Name}" />
|
||||
<DataGridTextColumn Header="描述"
|
||||
Binding="{Binding Description}" />
|
||||
<DataGridTextColumn IsReadOnly="True"
|
||||
Header="节点ID"
|
||||
Binding="{Binding NodeId}" />
|
||||
<DataGridTextColumn IsReadOnly="True"
|
||||
Header="协议类型"
|
||||
Binding="{Binding ProtocolType}" />
|
||||
<DataGridTextColumn IsReadOnly="True"
|
||||
Header="数据类型"
|
||||
Binding="{Binding DataType}" />
|
||||
<DataGridTemplateColumn Header="信号类型">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<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>
|
||||
</DockPanel>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user