Make it possible to feed in options to the Enumerate handler

This commit is contained in:
TheXamlGuy
2024-05-05 20:43:17 +01:00
parent 605a0284b5
commit ead288ab52
11 changed files with 124 additions and 28 deletions
+14 -2
View File
@@ -14,8 +14,20 @@
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression>
</ConditionAction.Condition>
<NavigateAction Context="Main" Route="Vault" />
</ConditionAction>
<NavigateAction Context="Main" Route="Vault">
<NavigateAction.ParameterBindings>
<ParameterBinding Key="Filter" Value="{Binding Filter}" />
</NavigateAction.ParameterBindings>
</NavigateAction>
</ConditionAction>
<ConditionAction>
<ConditionAction.Condition>
<ConditionalExpression ForwardChaining="And">
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="True" />
</ConditionalExpression>
</ConditionAction.Condition>
<InvokeCommandAction Command="{Binding InvokeCommand}" />
</ConditionAction>
</DataTriggerBehavior>
</Interaction.Behaviors>
</NavigationViewItem>
+13 -1
View File
@@ -14,7 +14,19 @@
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression>
</ConditionAction.Condition>
<NavigateAction Context="Main" Route="Vault" />
<NavigateAction Context="Main" Route="Vault">
<NavigateAction.ParameterBindings>
<ParameterBinding Key="Filter" Value="{Binding Filter}" />
</NavigateAction.ParameterBindings>
</NavigateAction>
</ConditionAction>
<ConditionAction>
<ConditionAction.Condition>
<ConditionalExpression ForwardChaining="And">
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="True" />
</ConditionalExpression>
</ConditionAction.Condition>
<InvokeCommandAction Command="{Binding InvokeCommand}" />
</ConditionAction>
</DataTriggerBehavior>
</Interaction.Behaviors>
+13 -1
View File
@@ -14,7 +14,19 @@
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression>
</ConditionAction.Condition>
<NavigateAction Context="Main" Route="Vault" />
<NavigateAction Context="Main" Route="Vault">
<NavigateAction.ParameterBindings>
<ParameterBinding Key="Filter" Value="{Binding Filter}" />
</NavigateAction.ParameterBindings>
</NavigateAction>
</ConditionAction>
<ConditionAction>
<ConditionAction.Condition>
<ConditionalExpression ForwardChaining="And">
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="True" />
</ConditionalExpression>
</ConditionAction.Condition>
<InvokeCommandAction Command="{Binding InvokeCommand}" />
</ConditionAction>
</DataTriggerBehavior>
</Interaction.Behaviors>
+1 -1
View File
@@ -17,7 +17,7 @@
Height="40"
Margin="0,4,0,0"
ColumnDefinitions="*,Auto">
<TextBlock Grid.Column="0" Text="Title goes here" />
<TextBlock Grid.Column="0" Text="{Binding Filter}" />
<Button
Grid.Column="1"
Width="{StaticResource ButtonWidth}"
+1 -1
View File
@@ -8,4 +8,4 @@ public partial class AllNavigationViewModel(IServiceProvider provider,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
string name) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
string filter) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, filter);
+3
View File
@@ -0,0 +1,3 @@
namespace Bitvault;
public record Filter<TValue>(TValue? Value);
+16 -9
View File
@@ -4,14 +4,7 @@ using Toolkit.Foundation;
namespace Bitvault;
public partial class FilterVaultNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
string name) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
public partial class FilterVaultNavigationViewModel : ObservableViewModel,
IVaultNavigationViewModel,
INotificationHandler<Vault<Activated>>,
INotificationHandler<Vault<Deactivated>>
@@ -19,9 +12,23 @@ public partial class FilterVaultNavigationViewModel(IServiceProvider provider,
[ObservableProperty]
private bool activated;
[ObservableProperty]
private string? filter;
[ObservableProperty]
private bool selected;
public FilterVaultNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Filter = filter;
}
public Task Handle(Vault<Deactivated> args,
CancellationToken cancellationToken = default) =>
Task.FromResult(Activated = false);
@@ -31,5 +38,5 @@ public partial class FilterVaultNavigationViewModel(IServiceProvider provider,
Task.FromResult(Activated = true);
[RelayCommand]
public void Invoke() => Publisher.Publish(Vault.As(new Selected<string>(name)));
public async Task Invoke() => await Publisher.Publish(Vault.As(new Filter<string>(Filter)), nameof(VaultViewModel));
}
+1 -1
View File
@@ -14,4 +14,4 @@ public partial class FooterViewModel :
{
Add<ManageNavigationViewModel>();
}
}
}
+23 -4
View File
@@ -1,16 +1,22 @@
using Toolkit.Foundation;
using CommunityToolkit.Mvvm.ComponentModel;
using Toolkit.Foundation;
namespace Bitvault;
[Notification(nameof(VaultViewModel))]
public partial class VaultViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
IContentTemplate template) : ObservableCollectionViewModel<LockerNavigationViewModel>(provider, factory, mediator, publisher, subscriber, disposer)
IContentTemplate template,
string? filter = null) : ObservableCollectionViewModel<LockerNavigationViewModel>(provider, factory, mediator, publisher, subscriber, disposer),
INotificationHandler<Vault<Filter<string>>>
{
[ObservableProperty]
private string? filter = filter;
public IContentTemplate Template { get; set; } = template;
public override async Task Activated()
@@ -24,4 +30,17 @@ public partial class VaultViewModel(IServiceProvider provider,
await Publisher.Publish(Vault.As<Deactivated>());
await base.Deactivated();
}
protected override IEnumerate CreateEnumeration(object? key) =>
Enumerate<LockerNavigationViewModel>.With(new VaultViewModelOptions { Filter = Filter }) with { Key = key };
public async Task Handle(Vault<Filter<string>> args,
CancellationToken cancellationToken = default)
{
if (args.Value is Filter<string> filter)
{
Filter = filter.Value;
await Enumerate();
}
}
}
+33 -8
View File
@@ -4,19 +4,44 @@ namespace Bitvault;
public class VaultViewModelHandler(IServiceFactory factory,
IPublisher publisher) :
INotificationHandler<Enumerate<LockerNavigationViewModel>>
INotificationHandler<Enumerate<LockerNavigationViewModel, VaultViewModelOptions>>
{
public async Task Handle(Enumerate<LockerNavigationViewModel> args,
public async Task Handle(Enumerate<LockerNavigationViewModel, VaultViewModelOptions> args,
CancellationToken cancellationToken = default)
{
Random rnd = new Random();
int d = rnd.Next(5, 10);
for (int i = 0; i < 2; i++)
if (args.Options?.Filter is "All")
{
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
for (int i = 0; i < 100; i++)
{
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel),
nameof(VaultViewModel), cancellationToken);
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
{
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel),
nameof(VaultViewModel), cancellationToken);
}
}
}
if (args.Options?.Filter is "Starred")
{
for (int i = 0; i < 10; i++)
{
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
{
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel),
nameof(VaultViewModel), cancellationToken);
}
}
}
if (args.Options?.Filter is "Archive")
{
for (int i = 0; i < 100000; i++)
{
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
{
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel),
nameof(VaultViewModel), cancellationToken);
}
}
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Bitvault;
public record VaultViewModelOptions
{
public string? Filter { get; set; }
}