From d7ddce06e1b19da837ea5afce2140a87b31845b8 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Mon, 7 Jul 2025 21:41:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=90=9C=E7=B4=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ViewModels/VariableTableViewModel.cs | 65 +++++++++++++++++++++------- Views/VariableTableView.xaml | 34 +++++++++------ 2 files changed, 70 insertions(+), 29 deletions(-) diff --git a/ViewModels/VariableTableViewModel.cs b/ViewModels/VariableTableViewModel.cs index 5482980..ca9752c 100644 --- a/ViewModels/VariableTableViewModel.cs +++ b/ViewModels/VariableTableViewModel.cs @@ -1,4 +1,7 @@ using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Windows.Data; +using System.Windows.Input; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using iNKORE.UI.WPF.Modern.Controls; @@ -16,18 +19,18 @@ partial class VariableTableViewModel : ViewModelBase { private readonly IDialogService _dialogService; - // private readonly ILogger _logger; [ObservableProperty] private VariableTable variableTable; - - [ObservableProperty] - private ObservableCollection _dataVariables; - - private ObservableCollection _originalDataVariables; + private ObservableCollection _dataVariables = new ObservableCollection(); [ObservableProperty] private VariableData _selectedVariableData; + [ObservableProperty] + private string _searchText; + + public ICollectionView VariableDataView { get; private set; } + /// /// 是否是第一次加载,防止ToggleSwitch第一次加载触发改变事件 /// @@ -35,30 +38,62 @@ partial class VariableTableViewModel : ViewModelBase private readonly VarTableRepository _varTableRepository; private readonly VarDataRepository _varDataRepository; + private ObservableCollection? _originalDataVariables; public VariableTableViewModel(IDialogService dialogService) { _dialogService = dialogService; IsLoadCompletion = false; - // _logger = logger; _varTableRepository = new VarTableRepository(); _varDataRepository = new VarDataRepository(); + _dataVariables = new ObservableCollection(); // Initialize here + VariableDataView = CollectionViewSource.GetDefaultView(_dataVariables); + VariableDataView.Filter = FilterVariables; } + private bool FilterVariables(object item) + { + if (string.IsNullOrWhiteSpace(SearchText)) + { + return true; + } + + if (item is VariableData variable) + { + var searchTextLower = SearchText.ToLower(); + return variable.Name?.ToLower().Contains(searchTextLower) == true || + variable.Description?.ToLower().Contains(searchTextLower) == true || + variable.NodeId?.ToLower().Contains(searchTextLower) == true || + variable.S7Address?.ToLower().Contains(searchTextLower) == true || + variable.DataValue?.ToLower().Contains(searchTextLower) == true || + variable.DisplayValue?.ToLower().Contains(searchTextLower) == true; + } + return false; + } + + partial void OnSearchTextChanged(string value) + { + VariableDataView?.Refresh(); + } + + public override void OnLoaded() { if (VariableTable.DataVariables != null) { - DataVariables = new ObservableCollection(VariableTable.DataVariables); + _dataVariables = new ObservableCollection(VariableTable.DataVariables); + VariableDataView = CollectionViewSource.GetDefaultView(_dataVariables); + VariableDataView.Filter = FilterVariables; + // 3. 创建原始数据的深拷贝备份 // 推荐使用 JSON 序列化/反序列化进行深度拷贝 - var serialized = JsonConvert.SerializeObject(DataVariables); + var serialized = JsonConvert.SerializeObject(_dataVariables); _originalDataVariables = JsonConvert.DeserializeObject>(serialized); // 在数据加载完成后,将所有变量的 IsModified 状态重置为 false - foreach (var variableData in DataVariables) + foreach (var variableData in _dataVariables) { variableData.IsModified = false; } @@ -74,7 +109,7 @@ partial class VariableTableViewModel : ViewModelBase /// public override async Task OnExitAsync() { - var modifiedDatas = DataVariables.Where(d => d.IsModified == true) + var modifiedDatas = _dataVariables.Where(d => d.IsModified == true) .ToList(); if (modifiedDatas.Count == 0) return true; @@ -102,7 +137,7 @@ partial class VariableTableViewModel : ViewModelBase [RelayCommand] private async void SaveModifiedVarData() { - var modifiedDatas = DataVariables.Where(d => d.IsModified == true) + var modifiedDatas = _dataVariables.Where(d => d.IsModified == true) .ToList(); ///更新数据库 await _varDataRepository.UpdateAsync(modifiedDatas); @@ -167,7 +202,7 @@ partial class VariableTableViewModel : ViewModelBase //更新界面 // variableTable.DataVariables.AddRange(resVarDataList); variableTable.DataVariables= await _varDataRepository.GetAllAsync(); - DataVariables=new ObservableCollection(variableTable.DataVariables); + _dataVariables=new ObservableCollection(variableTable.DataVariables); processingDialog?.Hide(); string msgSuccess = $"成功导入变量:{resVarDataCount}个。"; @@ -199,7 +234,7 @@ partial class VariableTableViewModel : ViewModelBase // 更新数据库 await _varDataRepository.AddAsync(varData); // 更新当前页面的 - DataVariables.Add(varData); + _dataVariables.Add(varData); NotificationHelper.ShowSuccess($"添加变量成功:{varData?.Name}"); } catch (Exception e) @@ -233,7 +268,7 @@ partial class VariableTableViewModel : ViewModelBase { foreach (var variable in variablesToDelete) { - DataVariables.Remove(variable); + _dataVariables.Remove(variable); } NotificationHelper.ShowSuccess($"成功删除 {result} 个变量"); } diff --git a/Views/VariableTableView.xaml b/Views/VariableTableView.xaml index 05b3e46..4a56f01 100644 --- a/Views/VariableTableView.xaml +++ b/Views/VariableTableView.xaml @@ -78,8 +78,8 @@ - - + + @@ -87,16 +87,14 @@ - + - @@ -136,8 +134,13 @@ Text="协议:" /> - - + + @@ -150,7 +153,7 @@ CanUserSortColumns="True" SelectionMode="Extended" SelectedItem="{Binding SelectedVariableData}" - ItemsSource="{Binding DataVariables}"> + ItemsSource="{Binding VariableDataView}"> - + @@ -264,10 +268,12 @@ - + - + @@ -292,7 +298,7 @@ - + @@ -317,4 +323,4 @@ - + \ No newline at end of file