完成信号类型的绑定,和选择
This commit is contained in:
@@ -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; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user