Fixed perf issues

This commit is contained in:
TheXamlGuy
2024-07-02 23:38:51 +01:00
parent 929d72e4e8
commit e1ffb541f6
29 changed files with 139 additions and 82 deletions
+8 -6
View File
@@ -142,7 +142,7 @@ public partial class App : Application
services.AddTemplate<WalletViewModel, WalletView>("Wallet"); services.AddTemplate<WalletViewModel, WalletView>("Wallet");
services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ItemCollection"); services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ItemCollection");
services.AddHandler<SynchronizeItemCollectionViewModelHandler>(); services.AddHandler<ItemCollectionViewModelActivatedHandler>();
services.AddTemplate<WalletHeaderViewModel, WalletHeaderView>("WalletHeader"); services.AddTemplate<WalletHeaderViewModel, WalletHeaderView>("WalletHeader");
services.AddTemplate<BackActionViewModel, BackActionView>(); services.AddTemplate<BackActionViewModel, BackActionView>();
@@ -151,15 +151,17 @@ public partial class App : Application
services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection"); services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection");
services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>(); services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>();
services.AddHandler<SynchronizeCategoriesNavigationViewModelHandler>(); services.AddHandler<CategoriesNavigationViewModelActivationHandler>();
services.AddHandler<SynchronizeItemCategoryViewModelHandler>(); services.AddHandler<ItemCategoryViewModelActivatedHandler>();
services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>(); services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>();
services.AddTemplate<AddItemNavigationViewModel, AddItemNavigationView>(); services.AddTemplate<AddItemNavigationViewModel, AddItemNavigationView>();
services.AddTemplate<ItemNavigationViewModel, ItemNavigationView>(); services.AddTemplate<ItemNavigationViewModel, ItemNavigationView>();
services.AddHandler<ItemNavigationViewModelActivatedHandler>();
services.AddTemplate<EmptyItemCollectionViewModel, EmptyItemCollectionView>("EmptyItemCollection"); services.AddTemplate<EmptyItemCollectionViewModel, EmptyItemCollectionView>("EmptyItemCollection");
services.AddScoped<IDecoratorService<ItemHeaderConfiguration>, DecoratorService<ItemHeaderConfiguration>>(); services.AddScoped<IDecoratorService<ItemHeaderConfiguration>, DecoratorService<ItemHeaderConfiguration>>();
@@ -170,8 +172,8 @@ public partial class App : Application
services.AddTemplate<ItemHeaderViewModel, ItemHeaderView>(); services.AddTemplate<ItemHeaderViewModel, ItemHeaderView>();
services.AddTemplate<ItemContentViewModel, ItemContentView>(); services.AddTemplate<ItemContentViewModel, ItemContentView>();
services.AddHandler<SynchronizeItemContentViewModelHandler>(); services.AddHandler<ItemContentViewModelActivationHandler>();
services.AddHandler<SynchronizeItemContentFromCategoryViewModelHandler>(); services.AddHandler<ItemContentFromCategoryViewModelActivationHandler>();
services.AddTemplate<ItemSectionViewModel, ItemSectionView>(); services.AddTemplate<ItemSectionViewModel, ItemSectionView>();
@@ -230,7 +232,7 @@ public partial class App : Application
services.AddHandler<CreateProfileImageHandler>(); services.AddHandler<CreateProfileImageHandler>();
services.AddTemplate<MainViewModel, MainView>("Main"); services.AddTemplate<MainViewModel, MainView>("Main");
services.AddHandler<SynchronizeMainViewModelHandler>(); services.AddHandler<MainViewModelActivationHandler>();
services.AddTransient<FooterViewModel>(); services.AddTransient<FooterViewModel>();
+6 -3
View File
@@ -17,13 +17,16 @@
<Parameter Key="Name" Value="{Binding Name}" /> <Parameter Key="Name" Value="{Binding Name}" />
<Parameter Key="ImageDescriptor" Value="{Binding ImageDescriptor}" /> <Parameter Key="ImageDescriptor" Value="{Binding ImageDescriptor}" />
<Parameter Key="FromCategory" Value="{x:False}" /> <Parameter Key="FromCategory" Value="{x:False}" />
<Parameter Key="Favourite" Value="{Binding Favourite}" /> <Parameter Key="Favourite" Value="{Binding IsFavourite}" />
<Parameter Key="Archived" Value="{Binding Archived}" /> <Parameter Key="Archived" Value="{Binding IsArchived}" />
<Parameter Key="State" Value="{x:Static vm:ItemState.Read}" /> <Parameter Key="State" Value="{x:Static vm:ItemState.Read}" />
<Parameter Key="IsBackStackEnabled" Value="{x:False}" /> <Parameter Key="IsBackStackEnabled" Value="{x:False}" />
<Parameter Key="ClearBackStack" Value="{x:True}" /> <Parameter Key="ClearBackStack" Value="{x:True}" />
</NavigateAction> </NavigateAction>
</AttachedEventTriggerBehaviour> </AttachedEventTriggerBehaviour>
<EventTriggerBehavior EventName="AttachedToVisualTree">
<InvokeCommandAction Command="{Binding AttachedCommand}" />
</EventTriggerBehavior>
</Interaction.Behaviors> </Interaction.Behaviors>
<Grid <Grid
Margin="0,6,6,6" Margin="0,6,6,6"
@@ -41,7 +44,7 @@
FontFamily="{DynamicResource FluentThemeFontFamily}" FontFamily="{DynamicResource FluentThemeFontFamily}"
FontSize="16" FontSize="16"
Foreground="{DynamicResource StarredIconForegroundBrush}" Foreground="{DynamicResource StarredIconForegroundBrush}"
IsVisible="{Binding Favourite}" IsVisible="{Binding IsFavourite}"
Text="&#xEF60;" /> Text="&#xEF60;" />
</Grid> </Grid>
<StackPanel Grid.Column="1" Margin="12,0,0,0"> <StackPanel Grid.Column="1" Margin="12,0,0,0">
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class ArchiveItemActionViewModel(IServiceProvider provider,
IRemovable IRemovable
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Archive.As<Item>()); private void Invoke() => Publisher.Publish(Archive.As<Item>());
} }
@@ -2,13 +2,13 @@
namespace Wallet; namespace Wallet;
public class SynchronizeCategoriesNavigationViewModelHandler(IMediator mediator, public class CategoriesNavigationViewModelActivationHandler(IMediator mediator,
IItemConfigurationCollection configurations, IItemConfigurationCollection configurations,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<CategoryNavigationViewModel>> INotificationHandler<ActivationEventArgs<CategoryNavigationViewModel>>
{ {
public async Task Handle(SynchronizeEventArgs<CategoryNavigationViewModel> args) public async Task Handle(ActivationEventArgs<CategoryNavigationViewModel> args)
{ {
IReadOnlyCollection<(string Name, int Count)>? counts = await mediator.Handle<CountEventArgs<Item>, IReadOnlyCollection<(string Name, int Count)>? counts = await mediator.Handle<CountEventArgs<Item>,
IReadOnlyCollection<(string, int)>>(Count.As<Item>()); IReadOnlyCollection<(string, int)>>(Count.As<Item>());
+3 -3
View File
@@ -19,13 +19,13 @@ public class ConfirmCreateItemHandler(IMediator mediator,
IImageDescriptor? imageDescriptor = headerConfiguration.ImageDescriptor; IImageDescriptor? imageDescriptor = headerConfiguration.ImageDescriptor;
Guid id = Guid.NewGuid(); Guid id = Guid.NewGuid();
Item<(Guid, string, string, IImageDescriptor?)> item = new((id, name, category, imageDescriptor));
publisher.Publish(Created.As(item));
await mediator.Handle<CreateEventArgs<(Guid, string, string, IImageDescriptor?, await mediator.Handle<CreateEventArgs<(Guid, string, string, IImageDescriptor?,
ItemConfiguration)>, bool>(new CreateEventArgs<(Guid, string, string, IImageDescriptor?, ItemConfiguration)>, bool>(new CreateEventArgs<(Guid, string, string, IImageDescriptor?,
ItemConfiguration)>((id, name, category, imageDescriptor ?? default, itemConfiguration))); ItemConfiguration)>((id, name, category, imageDescriptor ?? default, itemConfiguration)));
Item<(Guid, string, string)> item = new((id, name, category));
publisher.Publish(Created.As(item));
publisher.Publish(Changed.As<Item>()); publisher.Publish(Changed.As<Item>());
} }
} }
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class ConfirmItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Confirm.As<Item>()); private void Invoke() => Publisher.Publish(Confirm.As<Item>());
} }
+2 -2
View File
@@ -58,11 +58,11 @@ public partial class CreateWalletViewModel :
} }
[RelayCommand] [RelayCommand]
public async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>, private async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
IImageDescriptor>(Create.As<ProfileImage>()); IImageDescriptor>(Create.As<ProfileImage>());
[RelayCommand] [RelayCommand]
public void Remove() => ImageDescriptor = null; private void Remove() => ImageDescriptor = null;
protected override void OnPropertyChanged(PropertyChangedEventArgs args) protected override void OnPropertyChanged(PropertyChangedEventArgs args)
{ {
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class DeleteItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Delete.As<Item>()); private void Invoke() => Publisher.Publish(Delete.As<Item>());
} }
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class DismissItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Cancel.As<Item>()); private void Invoke() => Publisher.Publish(Cancel.As<Item>());
} }
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class EditItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Update.As<Item>()); private void Invoke() => Publisher.Publish(Update.As<Item>());
} }
+1 -1
View File
@@ -13,7 +13,7 @@ public partial class FavouriteItemActionViewModel(IServiceProvider provider,
IRemovable IRemovable
{ {
[RelayCommand] [RelayCommand]
public void Invoke() private void Invoke()
{ {
if (!Value) if (!Value)
{ {
+1 -1
View File
@@ -16,5 +16,5 @@ public partial class HyperlinkEntryViewModel(IServiceProvider provider,
double width) : ItemEntryViewModel<string>(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width) double width) : ItemEntryViewModel<string>(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width)
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Create.As(new Hyperlink(Value))); private void Invoke() => Publisher.Publish(Create.As(new Hyperlink(Value)));
} }
+1 -4
View File
@@ -1,7 +1,4 @@
namespace Wallet; namespace Wallet;
public interface IItemViewModel : public interface IItemViewModel :
IDisposable IDisposable;
{
}
+1 -1
View File
@@ -23,5 +23,5 @@ public partial class ItemCategoryNavigationViewModel(IServiceProvider provider,
private bool isSelected = isSelected; private bool isSelected = isSelected;
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new ItemCategory<string>(Name))); private void Invoke() => Publisher.Publish(Notify.As(new ItemCategory<string>(Name)));
} }
@@ -2,12 +2,12 @@
namespace Wallet; namespace Wallet;
public class SynchronizeItemCategoryViewModelHandler(IItemConfigurationCollection configurations, public class ItemCategoryViewModelActivatedHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemCategoryNavigationViewModel>> INotificationHandler<ActivationEventArgs<ItemCategoryNavigationViewModel>>
{ {
public Task Handle(SynchronizeEventArgs<ItemCategoryNavigationViewModel> args) public Task Handle(ActivationEventArgs<ItemCategoryNavigationViewModel> args)
{ {
bool selected = true; bool selected = true;
foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations) foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations)
+4 -4
View File
@@ -42,7 +42,7 @@ public partial class ItemCollectionViewModel :
if (args.Sender is Filter filter) if (args.Sender is Filter filter)
{ {
configuration = configuration with { Filter = filter.Value }; configuration = configuration with { Filter = filter.Value };
Synchronize(true); Activate(true);
} }
return Task.CompletedTask; return Task.CompletedTask;
@@ -53,7 +53,7 @@ public partial class ItemCollectionViewModel :
if (args.Sender is Search<string> search) if (args.Sender is Search<string> search)
{ {
configuration = configuration with { Query = search.Value }; configuration = configuration with { Query = search.Value };
Synchronize(true); Activate(true);
} }
return Task.CompletedTask; return Task.CompletedTask;
@@ -69,6 +69,6 @@ public partial class ItemCollectionViewModel :
return base.OnActivated(); return base.OnActivated();
} }
protected override SynchronizeExpression BuildAggregateExpression() => protected override ActivationBuilder ActivationBuilder() =>
new(Toolkit.Foundation.Synchronize.As<ItemNavigationViewModel, ItemCollectionConfiguration>(configuration)); new(Activation.As<ItemNavigationViewModel, ItemCollectionConfiguration>(configuration));
} }
@@ -3,13 +3,13 @@ using Toolkit.Foundation;
namespace Wallet; namespace Wallet;
public class SynchronizeItemCollectionViewModelHandler(IMediator mediator, public class ItemCollectionViewModelActivatedHandler(IMediator mediator,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ICache<Item<(Guid, string)>> cache, ICache<Item<(Guid, string)>> cache,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemNavigationViewModel, ItemCollectionConfiguration>> INotificationHandler<ActivationEventArgs<ItemNavigationViewModel, ItemCollectionConfiguration>>
{ {
public async Task Handle(SynchronizeEventArgs<ItemNavigationViewModel, public async Task Handle(ActivationEventArgs<ItemNavigationViewModel,
ItemCollectionConfiguration> args) ItemCollectionConfiguration> args)
{ {
if (args.Value is ItemCollectionConfiguration configuration) if (args.Value is ItemCollectionConfiguration configuration)
@@ -3,14 +3,14 @@ using Toolkit.Foundation;
namespace Wallet; namespace Wallet;
public class SynchronizeItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations, public class ItemContentFromCategoryViewModelActivationHandler(IItemConfigurationCollection configurations,
IDecoratorService<ItemConfiguration> itemConfigurationDecorator, IDecoratorService<ItemConfiguration> itemConfigurationDecorator,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IMediator mediator, IMediator mediator,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<IItemEntryViewModel, string>> INotificationHandler<ActivationEventArgs<IItemEntryViewModel, string>>
{ {
public async Task Handle(SynchronizeEventArgs<IItemEntryViewModel, string> args) public async Task Handle(ActivationEventArgs<IItemEntryViewModel, string> args)
{ {
if (args.Value is string category) if (args.Value is string category)
{ {
+1 -1
View File
@@ -21,7 +21,7 @@ public partial class ItemContentViewModel(IServiceProvider provider,
if (args.Sender is ItemCategory<string> category if (args.Sender is ItemCategory<string> category
&& category.Value is string value) && category.Value is string value)
{ {
Fetch(() => new SynchronizeExpression(new SynchronizeEventArgs<IItemEntryViewModel, Activate(() => new ActivationBuilder(new ActivationEventArgs<IItemEntryViewModel,
string>(value)), true); string>(value)), true);
} }
@@ -3,14 +3,14 @@ using Toolkit.Foundation;
namespace Wallet; namespace Wallet;
public class SynchronizeItemContentViewModelHandler(IDecoratorService<Item<(Guid, string)>> itemDecorator, public class ItemContentViewModelActivationHandler(IDecoratorService<Item<(Guid, string)>> itemDecorator,
IDecoratorService<ItemConfiguration> itemConfigurationDecorator, IDecoratorService<ItemConfiguration> itemConfigurationDecorator,
IMediator mediator, IMediator mediator,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemSectionViewModel>> INotificationHandler<ActivationEventArgs<ItemSectionViewModel>>
{ {
public async Task Handle(SynchronizeEventArgs<ItemSectionViewModel> args) public async Task Handle(ActivationEventArgs<ItemSectionViewModel> args)
{ {
if (itemDecorator.Service is Item<(Guid, string)> item) if (itemDecorator.Service is Item<(Guid, string)> item)
{ {
+5 -5
View File
@@ -6,20 +6,20 @@ namespace Wallet;
public class ItemCreatedHandler(IServiceProvider serviceProvider, public class ItemCreatedHandler(IServiceProvider serviceProvider,
ICache<Item<(Guid, string)>> cache, ICache<Item<(Guid, string)>> cache,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<CreatedEventArgs<Item<(Guid, string, string, IImageDescriptor?)>>> INotificationHandler<CreatedEventArgs<Item<(Guid, string, string)>>>
{ {
public Task Handle(CreatedEventArgs<Item<(Guid, string, string, IImageDescriptor?)>> args) public Task Handle(CreatedEventArgs<Item<(Guid, string, string)>> args)
{ {
if (args.Sender is Item<(Guid, string, string, IImageDescriptor?)> item) if (args.Sender is Item<(Guid, string, string)> item)
{ {
(Guid id, string name, string category, IImageDescriptor? imageDescriptor) = item.Value; (Guid id, string name, string category) = item.Value;
IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceScope serviceScope = serviceProvider.CreateScope();
IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService<IServiceFactory>(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService<IServiceFactory>();
IDecoratorService<Item<(Guid, string)>> decoratorService = serviceScope.ServiceProvider.GetRequiredService<IDecoratorService<Item<(Guid, string)>>>(); IDecoratorService<Item<(Guid, string)>> decoratorService = serviceScope.ServiceProvider.GetRequiredService<IDecoratorService<Item<(Guid, string)>>>();
if (serviceFactory.Create<ItemNavigationViewModel>(args => args.Initialize(), if (serviceFactory.Create<ItemNavigationViewModel>(args => args.Initialize(),
id, name, "Description", category, imageDescriptor, true) id, name, "Description", category, true)
is ItemNavigationViewModel viewModel) is ItemNavigationViewModel viewModel)
{ {
Item<(Guid, string)> cachedItem = new((id, name)); Item<(Guid, string)> cachedItem = new((id, name));
+2 -2
View File
@@ -74,11 +74,11 @@ public partial class ItemHeaderViewModel :
} }
[RelayCommand] [RelayCommand]
public async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>, private async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
IImageDescriptor>(Create.As<ProfileImage>()); IImageDescriptor>(Create.As<ProfileImage>());
[RelayCommand] [RelayCommand]
public void Remove() => ImageDescriptor = null; private void Remove() => ImageDescriptor = null;
protected override void OnValueChanged() protected override void OnValueChanged()
{ {
+58 -20
View File
@@ -1,4 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Diagnostics;
using Toolkit.Foundation; using Toolkit.Foundation;
namespace Wallet; namespace Wallet;
@@ -15,10 +17,9 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
string name = "", string name = "",
string description = "", string description = "",
string category = "", string category = "",
IImageDescriptor? imageDescriptor = default,
bool isSelected = false, bool isSelected = false,
bool favourite = false, bool isFavourite = false,
bool archived = false) : bool isArchived = false) :
Observable(provider, factory, mediator, publisher, subscriber, disposer), Observable(provider, factory, mediator, publisher, subscriber, disposer),
INotificationHandler<ArchiveEventArgs<Item>>, INotificationHandler<ArchiveEventArgs<Item>>,
INotificationHandler<UnarchiveEventArgs<Item>>, INotificationHandler<UnarchiveEventArgs<Item>>,
@@ -26,28 +27,30 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
INotificationHandler<UnfavouriteEventArgs<Item>>, INotificationHandler<UnfavouriteEventArgs<Item>>,
INotificationHandler<DeleteEventArgs<Item>>, INotificationHandler<DeleteEventArgs<Item>>,
INotificationHandler<NotifyEventArgs<ItemHeader<string>>>, INotificationHandler<NotifyEventArgs<ItemHeader<string>>>,
INotificationHandler<NotifyEventArgs<Item<IImageDescriptor>>>,
IKeyed<Guid>, IKeyed<Guid>,
ISelectable, ISelectable,
IRemovable IRemovable
{ {
[ObservableProperty]
private bool archived = archived;
[ObservableProperty] [ObservableProperty]
private string? category = category; private string? category = category;
[ObservableProperty] [ObservableProperty]
private string? description = description; private string? description = description;
[ObservableProperty]
private bool favourite = favourite;
[ObservableProperty] [ObservableProperty]
private Guid id = id; private Guid id = id;
[ObservableProperty] [ObservableProperty]
private IImageDescriptor? imageDescriptor = imageDescriptor; private IImageDescriptor? imageDescriptor;
[ObservableProperty]
private bool isArchived = isArchived;
[ObservableProperty]
private bool isAttached;
[ObservableProperty]
private bool isFavourite = isFavourite;
[ObservableProperty] [ObservableProperty]
private bool isSelected = isSelected; private bool isSelected = isSelected;
@@ -58,17 +61,29 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
private string named = $"{named}"; private string named = $"{named}";
public IContentTemplate Template { get; set; } = template; public IContentTemplate Template { get; set; } = template;
public Task Handle(ArchiveEventArgs<Item> args) => public Task Handle(ArchiveEventArgs<Item> args)
Task.Run(Dispose); {
Dispose();
return Task.CompletedTask;
}
public Task Handle(UnarchiveEventArgs<Item> args) => public Task Handle(UnarchiveEventArgs<Item> args)
Task.Run(Dispose); {
Dispose();
return Task.CompletedTask;
}
public Task Handle(FavouriteEventArgs<Item> args) => public Task Handle(FavouriteEventArgs<Item> args)
Task.FromResult(Favourite = true); {
IsFavourite = true;
return Task.CompletedTask;
}
public Task Handle(UnfavouriteEventArgs<Item> args) => public Task Handle(UnfavouriteEventArgs<Item> args)
Task.FromResult(Favourite = false); {
IsFavourite = false;
return Task.CompletedTask;
}
public Task Handle(NotifyEventArgs<ItemHeader<string>> args) public Task Handle(NotifyEventArgs<ItemHeader<string>> args)
{ {
@@ -80,6 +95,29 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
return Task.CompletedTask; return Task.CompletedTask;
} }
public Task Handle(DeleteEventArgs<Item> args) => public Task Handle(DeleteEventArgs<Item> args)
Task.Run(Dispose); {
Dispose();
return Task.CompletedTask;
}
public Task Handle(NotifyEventArgs<Item<IImageDescriptor>> args)
{
if (args.Sender is Item<IImageDescriptor> item)
{
ImageDescriptor = item.Value;
}
return Task.CompletedTask;
}
[RelayCommand]
private void Attached()
{
if (!IsAttached)
{
Publisher.Publish(Activation.As<ItemNavigationViewModel, Guid>(Id));
IsAttached = true;
}
}
} }
@@ -0,0 +1,20 @@
using Toolkit.Foundation;
namespace Wallet;
public class ItemNavigationViewModelActivatedHandler(IMediator mediator,
IPublisher publisher) :
INotificationHandler<ActivationEventArgs<ItemNavigationViewModel, Guid>>
{
public async Task Handle(ActivationEventArgs<ItemNavigationViewModel, Guid> args)
{
Guid id = args.Value;
IImageDescriptor? imageDescriptor = await mediator.Handle<RequestEventArgs<ItemImage<Guid>>,
IImageDescriptor>(Request.As(new ItemImage<Guid>(id)));
if (imageDescriptor is not null)
{
publisher.Publish(Notify.As(new Item<IImageDescriptor>(imageDescriptor)));
}
}
}
-3
View File
@@ -146,7 +146,4 @@ public partial class ItemViewModel :
return base.OnActivated(); return base.OnActivated();
} }
protected override SynchronizeExpression BuildAggregateExpression() =>
new(Toolkit.Foundation.Synchronize.As<IItemViewModel, (string, string, ItemState)>(("", Name, State)));
} }
@@ -3,11 +3,11 @@ using Toolkit.Foundation;
namespace Wallet; namespace Wallet;
public class SynchronizeMainViewModelHandler(IPublisher publisher, public class MainViewModelActivationHandler(IPublisher publisher,
IWalletHostCollection Wallets) : IWalletHostCollection Wallets) :
INotificationHandler<SynchronizeEventArgs<IMainNavigationViewModel>> INotificationHandler<ActivationEventArgs<IMainNavigationViewModel>>
{ {
public Task Handle(SynchronizeEventArgs<IMainNavigationViewModel> args) public Task Handle(ActivationEventArgs<IMainNavigationViewModel> args)
{ {
bool selected = true; bool selected = true;
+1 -1
View File
@@ -15,6 +15,6 @@ public partial class SearchWalletActionViewModel(IServiceProvider provider,
private int index = 2; private int index = 2;
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Search<string>(Value)), private void Invoke() => Publisher.Publish(Notify.As(new Search<string>(Value)),
nameof(ItemCollectionViewModel)); nameof(ItemCollectionViewModel));
} }
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class UnarchiveItemActionViewModel(IServiceProvider provider,
IRemovable IRemovable
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Unarchive.As<Item>()); private void Invoke() => Publisher.Publish(Unarchive.As<Item>());
} }
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class UnfavouriteItemActionViewModel(IServiceProvider provider,
IRemovable IRemovable
{ {
[RelayCommand] [RelayCommand]
public void Invoke() => Publisher.Publish(Unfavourite.As<Item>()); private void Invoke() => Publisher.Publish(Unfavourite.As<Item>());
} }