diff --git a/DMS.WPF/DMS.WPF.csproj b/DMS.WPF/DMS.WPF.csproj index a602e76..fe6ba64 100644 --- a/DMS.WPF/DMS.WPF.csproj +++ b/DMS.WPF/DMS.WPF.csproj @@ -148,6 +148,7 @@ + diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index e24e05a..0af05b0 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -15,6 +15,7 @@ using DMS.Application.Interfaces; using DMS.Application.Services; using DMS.Helper; using Microsoft.Extensions.DependencyInjection; +using ObservableCollections; namespace DMS.WPF.ViewModels; @@ -57,11 +58,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable [ObservableProperty] private string _searchText; - /// - /// 用于在UI中显示和过滤变量数据的视图集合。 - /// - [ObservableProperty] - private ICollectionView variableView; /// /// 指示视图是否已完成首次加载。 @@ -96,6 +92,10 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 对话服务接口的实例。 private readonly DataServices _dataServices; + private readonly ObservableList _variableItemList; + private readonly ISynchronizedView _synchronizedView; + public NotifyCollectionChangedSynchronizedViewList VariableItemListView { get; } + public VariableTableViewModel(IMapper mapper, IDialogService dialogService, IVariableAppService variableAppService, DataServices dataServices) { @@ -105,8 +105,12 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable _dataServices = dataServices; IsLoadCompletion = false; // 初始设置为 false,表示未完成加载 _variables = new ObservableCollection(); // 初始化集合 - VariableView = CollectionViewSource.GetDefaultView(Variables); // 获取集合视图 - VariableView.Filter = FilterVariables; // 设置过滤方法 + + + _variableItemList = new ObservableList(); + _synchronizedView = _variableItemList.CreateView(v => v); + + VariableItemListView = _synchronizedView.ToNotifyCollectionChanged(); } /// @@ -115,34 +119,23 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// /// 要过滤的集合中的单个项。 /// 如果项匹配搜索条件则为 true,否则为 false。 - private bool FilterVariables(object item) + private bool FilterVariables(VariableItemViewModel item) { - // 如果搜索文本为空或空白,则显示所有项 - if (string.IsNullOrWhiteSpace(SearchText)) - { - return true; - } - // 尝试将项转换为 Variable 类型 - // if (item is Variable variable) - // { - // var searchTextLower = SearchText.ToLower(); - // // 检查变量的名称、描述、NodeId、S7地址、数据值或显示值是否包含搜索文本 - // 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; + var searchTextLower = SearchText.ToLower(); + // 检查变量的名称、描述、NodeId、S7地址、数据值或显示值是否包含搜索文本 + return item.Name?.ToLower() + .Contains(searchTextLower) == true || + item.Description?.ToLower() + .Contains(searchTextLower) == true || + item.OpcUaNodeId?.ToLower() + .Contains(searchTextLower) == true || + item.S7Address?.ToLower() + .Contains(searchTextLower) == true || + item.DataValue?.ToLower() + .Contains(searchTextLower) == true || + item.DisplayValue?.ToLower() + .Contains(searchTextLower) == true; } /// @@ -152,7 +145,15 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 新的搜索文本值。 partial void OnSearchTextChanged(string value) { - VariableView?.Refresh(); + // 如果搜索文本为空或空白,则显示所有项 + if (string.IsNullOrWhiteSpace(SearchText)) + { + _synchronizedView.ResetFilter(); + } + else + { + _synchronizedView.AttachFilter(FilterVariables); + } } /// @@ -161,22 +162,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// public override void OnLoaded() { - // 根据变量表的协议类型设置对应的布尔属性 - // IsS7ProtocolSelected = VariableTable.ProtocolType == ProtocolType.S7; - // IsOpcUaProtocolSelected = VariableTable.ProtocolType == ProtocolType.OpcUA; - // - // // 如果变量表包含数据变量,则进行初始化 - // if (VariableTable.Variables != null) - // { - // // // 将变量表中的数据变量复制到可观察集合中 - // Variables.Clear(); // 清空现有集合 - // foreach (var item in VariableTable.Variables) - // { - // Variables.Add(item); // 添加新项 - // } - // - // - // VariableView.Refresh(); // 刷新视图以应用过滤和排序 + _variableItemList.AddRange(CurrentVariableTable.Variables); // // // 创建原始数据的深拷贝备份,用于在取消保存时还原 // var settings = new JsonSerializerSettings @@ -191,7 +177,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable // { // variable.IsModified = false; // } - // } // 标记加载完成 IsLoadCompletion = true; @@ -314,6 +299,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable { variableDto.CreatedAt = DateTime.Now; variableDto.UpdatedAt = DateTime.Now; + variableDto.VariableTableId = CurrentVariableTable.Id; } var existList = await _variableAppService.FindExistingVariablesAsync(improtVariableDtos); @@ -334,6 +320,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable var isSuccess = await _variableAppService.BatchImportVariablesAsync(improtVariableDtos); if (isSuccess) { + _variableItemList.AddRange(_mapper.Map>(improtVariableDtos)); NotificationHelper.ShowSuccess($"从Excel导入变量成功,共导入变量:{improtVariableDtos.Count}个"); } } @@ -867,9 +854,11 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable public async Task OnNavigatedToAsync(MenuItemViewModel menu) { var varTable = _dataServices.VariableTables.FirstOrDefault(v => v.Id == menu.TargetId); + if (varTable != null) { CurrentVariableTable = varTable; + // 根据变量表的协议类型设置对应的布尔属性 if (CurrentVariableTable.Protocol == ProtocolType.S7) { @@ -879,6 +868,8 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable { IsOpcUaProtocolSelected = true; } + + OnLoaded(); } } } \ No newline at end of file diff --git a/DMS.WPF/Views/VariableTableView.xaml b/DMS.WPF/Views/VariableTableView.xaml index 5fbf9b1..10fb356 100644 --- a/DMS.WPF/Views/VariableTableView.xaml +++ b/DMS.WPF/Views/VariableTableView.xaml @@ -21,8 +21,6 @@ - @@ -167,7 +165,7 @@ CanUserSortColumns="True" SelectionMode="Extended" SelectedItem="{Binding SelectedVariable}" - ItemsSource="{Binding VariableView}" + ItemsSource="{Binding VariableItemListView}" Style="{StaticResource DataGridBaseStyle}"> @@ -292,7 +290,7 @@ Binding="{Binding OpcUaNodeId}" /> + Binding="{Binding CSharpDataType}" />