添加批量修改激活状态

This commit is contained in:
2025-07-16 15:50:57 +08:00
parent 77363efcf6
commit b17ee045ff
7 changed files with 93 additions and 10 deletions

View File

@@ -76,7 +76,8 @@ public partial class VariableData : ObservableObject
/// <summary> /// <summary>
/// 指示变量是否处于激活状态。 /// 指示变量是否处于激活状态。
/// </summary> /// </summary>
public bool IsActive { get; set; } [ObservableProperty]
public bool isActive;
/// <summary> /// <summary>
/// 指示变量是否被选中 /// 指示变量是否被选中

View File

@@ -203,4 +203,16 @@ public class DialogService :IDialogService
} }
return null; return null;
} }
public async Task<bool?> ShowIsActiveDialog(bool currentIsActive)
{
var vm = new IsActiveDialogViewModel(currentIsActive);
var dialog = new IsActiveDialog(vm);
var result = await dialog.ShowAsync();
if (result == ContentDialogResult.Primary)
{
return vm.SelectedIsActive;
}
return null;
}
} }

View File

@@ -24,4 +24,5 @@ public interface IDialogService
Task<Mqtt?> ShowMqttSelectionDialog(); Task<Mqtt?> ShowMqttSelectionDialog();
Task<List<VariableData>> ShowOpcUaImportDialog(string endpointUrl); Task<List<VariableData>> ShowOpcUaImportDialog(string endpointUrl);
Task<OpcUaUpdateType?> ShowOpcUaUpdateTypeDialog(); Task<OpcUaUpdateType?> ShowOpcUaUpdateTypeDialog();
Task<bool?> ShowIsActiveDialog(bool currentIsActive);
} }

View File

@@ -15,9 +15,12 @@ public partial class IsActiveDialogViewModel : ObservableObject
} }
[RelayCommand] [RelayCommand]
private void SelectIsActive(bool isActive) private void SelectIsActive(string isActiveString)
{ {
SelectedIsActive = isActive; if (bool.TryParse(isActiveString, out bool isActive))
{
SelectedIsActive = isActive;
}
} }
[RelayCommand] [RelayCommand]

View File

@@ -130,7 +130,8 @@ partial class VariableTableViewModel : ViewModelBase
/// 初始化服务、数据仓库和变量数据集合视图。 /// 初始化服务、数据仓库和变量数据集合视图。
/// </summary> /// </summary>
/// <param name="dialogService">对话服务接口的实例。</param> /// <param name="dialogService">对话服务接口的实例。</param>
public VariableTableViewModel(IMapper mapper,IDialogService dialogService,VarTableRepository varTableRepository,VarDataRepository varDataRepository) public VariableTableViewModel(IMapper mapper, IDialogService dialogService, VarTableRepository varTableRepository,
VarDataRepository varDataRepository)
{ {
_mapper = mapper; _mapper = mapper;
_dialogService = dialogService; _dialogService = dialogService;
@@ -546,7 +547,8 @@ partial class VariableTableViewModel : ViewModelBase
[RelayCommand] [RelayCommand]
public async Task ChangePollLevel(IList<object> variablesToChange) public async Task ChangePollLevel(IList<object> variablesToChange)
{ {
var validVariables = variablesToChange?.OfType<VariableData>().ToList(); var validVariables = variablesToChange?.OfType<VariableData>()
.ToList();
// 检查是否有变量被选中 // 检查是否有变量被选中
if (validVariables == null || !validVariables.Any()) if (validVariables == null || !validVariables.Any())
@@ -582,7 +584,8 @@ partial class VariableTableViewModel : ViewModelBase
public async Task ModifyOpcUaUpdateType(IList<object> variablesToChange) public async Task ModifyOpcUaUpdateType(IList<object> variablesToChange)
{ {
// 过滤出有效的VariableData对象 // 过滤出有效的VariableData对象
var validVariables = variablesToChange?.OfType<VariableData>().ToList(); var validVariables = variablesToChange?.OfType<VariableData>()
.ToList();
if (validVariables == null || !validVariables.Any()) if (validVariables == null || !validVariables.Any())
{ {
@@ -615,7 +618,8 @@ partial class VariableTableViewModel : ViewModelBase
[RelayCommand] [RelayCommand]
public async Task AddMqttServerToVariables(IList<object> variablesToAddMqtt) public async Task AddMqttServerToVariables(IList<object> variablesToAddMqtt)
{ {
var validVariables = variablesToAddMqtt?.OfType<VariableData>().ToList(); var validVariables = variablesToAddMqtt?.OfType<VariableData>()
.ToList();
// 检查是否有变量被选中 // 检查是否有变量被选中
if (validVariables == null || !validVariables.Any()) if (validVariables == null || !validVariables.Any())
@@ -662,6 +666,55 @@ partial class VariableTableViewModel : ViewModelBase
} }
} }
/// <summary>
/// 修改选定变量的启用状态。
/// </summary>
/// <param name="variablesToChange">要修改启用状态的变量数据列表。</param>
[RelayCommand]
public async Task ModifyIsActive(IList<object> variablesToChange)
{
var validVariables = variablesToChange?.OfType<VariableData>()
.ToList();
if (validVariables == null || !validVariables.Any())
{
NotificationHelper.ShowInfo("请选择要修改启用状态的变量");
return;
}
// 假设所有选中的变量都应该被设置为相同的状态,取第一个变量的当前状态的反值
var currentIsActive = validVariables.First()
.IsActive;
var newIsActive = !currentIsActive;
var confirm = await _dialogService.ShowIsActiveDialog(newIsActive);
if (confirm.HasValue && confirm.Value == newIsActive)
{
foreach (var variable in validVariables)
{
variable.IsActive = newIsActive;
}
await _varDataRepository.UpdateAsync(validVariables);
// 更新界面
foreach (var variable in validVariables)
{
var displayVar = DataVariables.FirstOrDefault(v => v.Id == variable.Id);
if (displayVar != null)
displayVar.IsActive = newIsActive;
}
NotificationHelper.ShowSuccess($"已成功将 {validVariables.Count} 个变量的启用状态修改为 {newIsActive}");
}
else
{
NotificationHelper.ShowInfo("操作已取消或状态未改变。");
}
}
/// <summary> /// <summary>
/// 当变量表的启用/禁用状态改变时调用。 /// 当变量表的启用/禁用状态改变时调用。
/// 更新数据库中变量表的激活状态,并显示相应的通知。 /// 更新数据库中变量表的激活状态,并显示相应的通知。

View File

@@ -5,6 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern"
xmlns:vm="clr-namespace:PMSWPF.ViewModels.Dialogs" xmlns:vm="clr-namespace:PMSWPF.ViewModels.Dialogs"
xmlns:vc="clr-namespace:PMSWPF.ValueConverts"
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance vm:IsActiveDialogViewModel}" d:DataContext="{d:DesignInstance vm:IsActiveDialogViewModel}"
Title="修改激活状态" Title="修改激活状态"
@@ -12,11 +13,16 @@
SecondaryButtonText="取消" SecondaryButtonText="取消"
PrimaryButtonClick="ContentDialog_PrimaryButtonClick" PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
SecondaryButtonClick="ContentDialog_SecondaryButtonClick"> SecondaryButtonClick="ContentDialog_SecondaryButtonClick">
<controls:ContentDialog.Resources>
<vc:NullableBooleanConverter x:Key="NullableBooleanConverter" />
</controls:ContentDialog.Resources>
<Grid> <Grid>
<StackPanel Orientation="Vertical" Margin="10"> <StackPanel Orientation="Vertical" Margin="10">
<TextBlock Text="请选择新的激活状态:" Margin="0,0,0,10" FontWeight="Bold"/> <StackPanel Orientation="Horizontal">
<RadioButton Content="启用" IsChecked="{Binding SelectedIsActive, Mode=TwoWay, Converter={StaticResource NullableBooleanConverter}, ConverterParameter=True}" Command="{Binding SelectIsActiveCommand}" CommandParameter="True" Margin="0,0,0,5"/> <RadioButton FontSize="16" Content="启用" IsChecked="{Binding SelectedIsActive, Mode=TwoWay, Converter={StaticResource NullableBooleanConverter}, ConverterParameter=True}" Command="{Binding SelectIsActiveCommand}" CommandParameter="True" Margin="10 5"/>
<RadioButton Content="停用" IsChecked="{Binding SelectedIsActive, Mode=TwoWay, Converter={StaticResource NullableBooleanConverter}, ConverterParameter=False}" Command="{Binding SelectIsActiveCommand}" CommandParameter="False"/> <RadioButton FontSize="16" Content="停用" IsChecked="{Binding SelectedIsActive, Mode=TwoWay, Converter={StaticResource NullableBooleanConverter}, ConverterParameter=False}" Command="{Binding SelectIsActiveCommand}" CommandParameter="False" Margin="10 5"/>
</StackPanel>
</StackPanel> </StackPanel>
</Grid> </Grid>
</controls:ContentDialog> </controls:ContentDialog>

View File

@@ -224,6 +224,13 @@
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Switch}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Switch}" />
</MenuItem.Icon> </MenuItem.Icon>
</MenuItem> </MenuItem>
<MenuItem Header="修改启用状态"
Command="{Binding ModifyIsActiveCommand}"
CommandParameter="{Binding PlacementTarget.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}">
<MenuItem.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Switch}" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="添加MQTT服务器" <MenuItem Header="添加MQTT服务器"
Command="{Binding AddMqttServerToVariablesCommand}" Command="{Binding AddMqttServerToVariablesCommand}"
CommandParameter="{Binding PlacementTarget.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"> CommandParameter="{Binding PlacementTarget.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}">