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}" />