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" /> <ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression> </ConditionalExpression>
</ConditionAction.Condition> </ConditionAction.Condition>
<NavigateAction Context="Main" Route="Vault" /> <NavigateAction Context="Main" Route="Vault">
</ConditionAction> <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> </DataTriggerBehavior>
</Interaction.Behaviors> </Interaction.Behaviors>
</NavigationViewItem> </NavigationViewItem>
+13 -1
View File
@@ -14,7 +14,19 @@
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" /> <ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression> </ConditionalExpression>
</ConditionAction.Condition> </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> </ConditionAction>
</DataTriggerBehavior> </DataTriggerBehavior>
</Interaction.Behaviors> </Interaction.Behaviors>
+13 -1
View File
@@ -14,7 +14,19 @@
<ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" /> <ComparisonCondition LeftOperand="{Binding Activated}" RightOperand="False" />
</ConditionalExpression> </ConditionalExpression>
</ConditionAction.Condition> </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> </ConditionAction>
</DataTriggerBehavior> </DataTriggerBehavior>
</Interaction.Behaviors> </Interaction.Behaviors>
+1 -1
View File
@@ -17,7 +17,7 @@
Height="40" Height="40"
Margin="0,4,0,0" Margin="0,4,0,0"
ColumnDefinitions="*,Auto"> ColumnDefinitions="*,Auto">
<TextBlock Grid.Column="0" Text="Title goes here" /> <TextBlock Grid.Column="0" Text="{Binding Filter}" />
<Button <Button
Grid.Column="1" Grid.Column="1"
Width="{StaticResource ButtonWidth}" Width="{StaticResource ButtonWidth}"
+1 -1
View File
@@ -8,4 +8,4 @@ public partial class AllNavigationViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer, 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; namespace Bitvault;
public partial class FilterVaultNavigationViewModel(IServiceProvider provider, public partial class FilterVaultNavigationViewModel : ObservableViewModel,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
string name) :
ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer),
IVaultNavigationViewModel, IVaultNavigationViewModel,
INotificationHandler<Vault<Activated>>, INotificationHandler<Vault<Activated>>,
INotificationHandler<Vault<Deactivated>> INotificationHandler<Vault<Deactivated>>
@@ -19,9 +12,23 @@ public partial class FilterVaultNavigationViewModel(IServiceProvider provider,
[ObservableProperty] [ObservableProperty]
private bool activated; private bool activated;
[ObservableProperty]
private string? filter;
[ObservableProperty] [ObservableProperty]
private bool selected; 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, public Task Handle(Vault<Deactivated> args,
CancellationToken cancellationToken = default) => CancellationToken cancellationToken = default) =>
Task.FromResult(Activated = false); Task.FromResult(Activated = false);
@@ -31,5 +38,5 @@ public partial class FilterVaultNavigationViewModel(IServiceProvider provider,
Task.FromResult(Activated = true); Task.FromResult(Activated = true);
[RelayCommand] [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>(); Add<ManageNavigationViewModel>();
} }
} }
+23 -4
View File
@@ -1,16 +1,22 @@
using Toolkit.Foundation; using CommunityToolkit.Mvvm.ComponentModel;
using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
[Notification(nameof(VaultViewModel))] [Notification(nameof(VaultViewModel))]
public partial class VaultViewModel(IServiceProvider provider, public partial class VaultViewModel(IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscriber subscriber, ISubscriber subscriber,
IDisposer disposer, 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 IContentTemplate Template { get; set; } = template;
public override async Task Activated() public override async Task Activated()
@@ -24,4 +30,17 @@ public partial class VaultViewModel(IServiceProvider provider,
await Publisher.Publish(Vault.As<Deactivated>()); await Publisher.Publish(Vault.As<Deactivated>());
await base.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, public class VaultViewModelHandler(IServiceFactory factory,
IPublisher publisher) : 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) CancellationToken cancellationToken = default)
{ {
Random rnd = new Random(); if (args.Options?.Filter is "All")
int d = rnd.Next(5, 10);
for (int i = 0; i < 2; i++)
{ {
if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel) for (int i = 0; i < 100; i++)
{ {
await publisher.Publish(new Create<LockerNavigationViewModel>(viewModel), if (factory.Create<LockerNavigationViewModel>() is LockerNavigationViewModel viewModel)
nameof(VaultViewModel), cancellationToken); {
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; }
}