添加搜索功能

This commit is contained in:
2025-07-07 21:41:46 +08:00
parent 8b7658a4a3
commit d7ddce06e1
2 changed files with 70 additions and 29 deletions

View File

@@ -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<VariableTableViewModel> _logger;
[ObservableProperty]
private VariableTable variableTable;
[ObservableProperty]
private ObservableCollection<VariableData> _dataVariables;
private ObservableCollection<VariableData> _originalDataVariables;
private ObservableCollection<VariableData> _dataVariables = new ObservableCollection<VariableData>();
[ObservableProperty]
private VariableData _selectedVariableData;
[ObservableProperty]
private string _searchText;
public ICollectionView VariableDataView { get; private set; }
/// <summary>
/// 是否是第一次加载,防止ToggleSwitch第一次加载触发改变事件
/// </summary>
@@ -35,30 +38,62 @@ partial class VariableTableViewModel : ViewModelBase
private readonly VarTableRepository _varTableRepository;
private readonly VarDataRepository _varDataRepository;
private ObservableCollection<VariableData>? _originalDataVariables;
public VariableTableViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
IsLoadCompletion = false;
// _logger = logger;
_varTableRepository = new VarTableRepository();
_varDataRepository = new VarDataRepository();
_dataVariables = new ObservableCollection<VariableData>(); // 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<VariableData>(VariableTable.DataVariables);
_dataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables);
VariableDataView = CollectionViewSource.GetDefaultView(_dataVariables);
VariableDataView.Filter = FilterVariables;
// 3. 创建原始数据的深拷贝备份
// 推荐使用 JSON 序列化/反序列化进行深度拷贝
var serialized = JsonConvert.SerializeObject(DataVariables);
var serialized = JsonConvert.SerializeObject(_dataVariables);
_originalDataVariables = JsonConvert.DeserializeObject<ObservableCollection<VariableData>>(serialized);
// 在数据加载完成后,将所有变量的 IsModified 状态重置为 false
foreach (var variableData in DataVariables)
foreach (var variableData in _dataVariables)
{
variableData.IsModified = false;
}
@@ -74,7 +109,7 @@ partial class VariableTableViewModel : ViewModelBase
/// <returns></returns>
public override async Task<bool> 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<VariableData>(variableTable.DataVariables);
_dataVariables=new ObservableCollection<VariableData>(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} 个变量");
}

View File

@@ -87,9 +87,8 @@
</ui:AppBarButton.Icon>
</ui:AppBarButton>
<ui:AppBarButton
Command="{Binding ImprotFromTiaVarTableCommand}"
Label="从TIA变量表导入">
<ui:AppBarButton Command="{Binding ImprotFromTiaVarTableCommand}"
Label="从TIA变量表导入">
<ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Import}" />
</ui:AppBarButton.Icon>
@@ -97,7 +96,6 @@
</ui:AppBarButton>
<ui:AppBarButton x:Name="ShareButton"
Label="Share">
<ui:AppBarButton.Icon>
@@ -136,8 +134,13 @@
Text="协议:" />
<TextBlock Style="{StaticResource VarTableValueStyle}"
Text="{Binding VariableTable.ProtocolType}" />
<TextBlock Style="{StaticResource VarTableLabelStyle}"
Text="搜索:" />
<TextBox Width="200"
HorizontalAlignment="Left"
Margin="5,0,0,0"
Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"
ui:ControlHelper.PlaceholderText="搜索变量..." />
</ikw:SimpleStackPanel>
@@ -150,7 +153,7 @@
CanUserSortColumns="True"
SelectionMode="Extended"
SelectedItem="{Binding SelectedVariableData}"
ItemsSource="{Binding DataVariables}">
ItemsSource="{Binding VariableDataView}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="添加变量"
@@ -245,7 +248,8 @@
<DataGridTextColumn IsReadOnly="True"
Header="数据类型"
Binding="{Binding DataType}" />
<DataGridTemplateColumn Header="信号类型" SortMemberPath="SignalType">
<DataGridTemplateColumn Header="信号类型"
SortMemberPath="SignalType">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SignalType, Converter={StaticResource EnumDescriptionConverter}}" />
@@ -264,10 +268,12 @@
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="轮询频率" SortMemberPath="PollLevelType">
<DataGridTemplateColumn Header="轮询频率"
SortMemberPath="PollLevelType">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding PollLevelType, Converter={StaticResource EnumDescriptionConverter}}" />
<TextBlock
Text="{Binding PollLevelType, Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>