添加搜索功能

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.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Data;
using System.Windows.Input;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using iNKORE.UI.WPF.Modern.Controls; using iNKORE.UI.WPF.Modern.Controls;
@@ -16,18 +19,18 @@ partial class VariableTableViewModel : ViewModelBase
{ {
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
// private readonly ILogger<VariableTableViewModel> _logger;
[ObservableProperty] [ObservableProperty]
private VariableTable variableTable; private VariableTable variableTable;
private ObservableCollection<VariableData> _dataVariables = new ObservableCollection<VariableData>();
[ObservableProperty]
private ObservableCollection<VariableData> _dataVariables;
private ObservableCollection<VariableData> _originalDataVariables;
[ObservableProperty] [ObservableProperty]
private VariableData _selectedVariableData; private VariableData _selectedVariableData;
[ObservableProperty]
private string _searchText;
public ICollectionView VariableDataView { get; private set; }
/// <summary> /// <summary>
/// 是否是第一次加载,防止ToggleSwitch第一次加载触发改变事件 /// 是否是第一次加载,防止ToggleSwitch第一次加载触发改变事件
/// </summary> /// </summary>
@@ -35,30 +38,62 @@ partial class VariableTableViewModel : ViewModelBase
private readonly VarTableRepository _varTableRepository; private readonly VarTableRepository _varTableRepository;
private readonly VarDataRepository _varDataRepository; private readonly VarDataRepository _varDataRepository;
private ObservableCollection<VariableData>? _originalDataVariables;
public VariableTableViewModel(IDialogService dialogService) public VariableTableViewModel(IDialogService dialogService)
{ {
_dialogService = dialogService; _dialogService = dialogService;
IsLoadCompletion = false; IsLoadCompletion = false;
// _logger = logger;
_varTableRepository = new VarTableRepository(); _varTableRepository = new VarTableRepository();
_varDataRepository = new VarDataRepository(); _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() public override void OnLoaded()
{ {
if (VariableTable.DataVariables != null) if (VariableTable.DataVariables != null)
{ {
DataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables); _dataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables);
VariableDataView = CollectionViewSource.GetDefaultView(_dataVariables);
VariableDataView.Filter = FilterVariables;
// 3. 创建原始数据的深拷贝备份 // 3. 创建原始数据的深拷贝备份
// 推荐使用 JSON 序列化/反序列化进行深度拷贝 // 推荐使用 JSON 序列化/反序列化进行深度拷贝
var serialized = JsonConvert.SerializeObject(DataVariables); var serialized = JsonConvert.SerializeObject(_dataVariables);
_originalDataVariables = JsonConvert.DeserializeObject<ObservableCollection<VariableData>>(serialized); _originalDataVariables = JsonConvert.DeserializeObject<ObservableCollection<VariableData>>(serialized);
// 在数据加载完成后,将所有变量的 IsModified 状态重置为 false // 在数据加载完成后,将所有变量的 IsModified 状态重置为 false
foreach (var variableData in DataVariables) foreach (var variableData in _dataVariables)
{ {
variableData.IsModified = false; variableData.IsModified = false;
} }
@@ -74,7 +109,7 @@ partial class VariableTableViewModel : ViewModelBase
/// <returns></returns> /// <returns></returns>
public override async Task<bool> OnExitAsync() public override async Task<bool> OnExitAsync()
{ {
var modifiedDatas = DataVariables.Where(d => d.IsModified == true) var modifiedDatas = _dataVariables.Where(d => d.IsModified == true)
.ToList(); .ToList();
if (modifiedDatas.Count == 0) if (modifiedDatas.Count == 0)
return true; return true;
@@ -102,7 +137,7 @@ partial class VariableTableViewModel : ViewModelBase
[RelayCommand] [RelayCommand]
private async void SaveModifiedVarData() private async void SaveModifiedVarData()
{ {
var modifiedDatas = DataVariables.Where(d => d.IsModified == true) var modifiedDatas = _dataVariables.Where(d => d.IsModified == true)
.ToList(); .ToList();
///更新数据库 ///更新数据库
await _varDataRepository.UpdateAsync(modifiedDatas); await _varDataRepository.UpdateAsync(modifiedDatas);
@@ -167,7 +202,7 @@ partial class VariableTableViewModel : ViewModelBase
//更新界面 //更新界面
// variableTable.DataVariables.AddRange(resVarDataList); // variableTable.DataVariables.AddRange(resVarDataList);
variableTable.DataVariables= await _varDataRepository.GetAllAsync(); variableTable.DataVariables= await _varDataRepository.GetAllAsync();
DataVariables=new ObservableCollection<VariableData>(variableTable.DataVariables); _dataVariables=new ObservableCollection<VariableData>(variableTable.DataVariables);
processingDialog?.Hide(); processingDialog?.Hide();
string msgSuccess = $"成功导入变量:{resVarDataCount}个。"; string msgSuccess = $"成功导入变量:{resVarDataCount}个。";
@@ -199,7 +234,7 @@ partial class VariableTableViewModel : ViewModelBase
// 更新数据库 // 更新数据库
await _varDataRepository.AddAsync(varData); await _varDataRepository.AddAsync(varData);
// 更新当前页面的 // 更新当前页面的
DataVariables.Add(varData); _dataVariables.Add(varData);
NotificationHelper.ShowSuccess($"添加变量成功:{varData?.Name}"); NotificationHelper.ShowSuccess($"添加变量成功:{varData?.Name}");
} }
catch (Exception e) catch (Exception e)
@@ -233,7 +268,7 @@ partial class VariableTableViewModel : ViewModelBase
{ {
foreach (var variable in variablesToDelete) foreach (var variable in variablesToDelete)
{ {
DataVariables.Remove(variable); _dataVariables.Remove(variable);
} }
NotificationHelper.ShowSuccess($"成功删除 {result} 个变量"); NotificationHelper.ShowSuccess($"成功删除 {result} 个变量");
} }

View File

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