diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 347910e..f282f09 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -9,7 +9,6 @@ using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Views; using MediatR; -using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Models; @@ -58,7 +57,7 @@ namespace ModernKeePass.ViewModels } public IEnumerable BreadCrumb => new List { _parent }; - public ObservableCollection History { get; } + public ObservableCollection History { get; private set; } /// /// Determines if the Entry is current or from history @@ -230,38 +229,21 @@ namespace ModernKeePass.ViewModels private readonly IResourceProxy _resource; private readonly IDialogService _dialog; private readonly INotificationService _notification; - private readonly GroupVm _parent; + private GroupVm _parent; private EntryVm _selectedItem; private int _selectedIndex; private bool _isEditMode; private bool _isRevealPassword; private double _passwordLength = 25; private bool _isDirty; - - public EntryDetailVm() { } - internal EntryDetailVm(string entryId) : this(entryId, - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService()) { } - - public EntryDetailVm(string entryId, IMediator mediator, INavigationService navigation, IResourceProxy resource, IDialogService dialog, INotificationService notification) + public EntryDetailVm(IMediator mediator, INavigationService navigation, IResourceProxy resource, IDialogService dialog, INotificationService notification) { _mediator = mediator; _navigation = navigation; _resource = resource; _dialog = dialog; _notification = notification; - SelectedItem = _mediator.Send(new GetEntryQuery { Id = entryId }).GetAwaiter().GetResult(); - _parent = _mediator.Send(new GetGroupQuery { Id = SelectedItem.ParentGroupId }).GetAwaiter().GetResult(); - History = new ObservableCollection { SelectedItem }; - foreach (var entry in SelectedItem.History.Skip(1)) - { - History.Add(entry); - } - SelectedIndex = 0; SaveCommand = new RelayCommand(async () => await SaveChanges(), () => Database.IsDirty); GeneratePasswordCommand = new RelayCommand(async () => await GeneratePassword()); @@ -271,6 +253,18 @@ namespace ModernKeePass.ViewModels GoBackCommand = new RelayCommand(() => _navigation.GoBack()); } + public async Task Initialize(string entryId) + { + SelectedItem = await _mediator.Send(new GetEntryQuery { Id = entryId }); + _parent = await _mediator.Send(new GetGroupQuery { Id = SelectedItem.ParentGroupId }); + History = new ObservableCollection { SelectedItem }; + foreach (var entry in SelectedItem.History.Skip(1)) + { + History.Add(entry); + } + SelectedIndex = 0; + } + private async Task AskForDelete() { if (IsCurrentEntry) diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index c0ab849..7667a08 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -9,7 +9,6 @@ using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Views; using MediatR; -using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Models; @@ -36,9 +35,9 @@ namespace ModernKeePass.ViewModels { public class GroupDetailVm : ObservableObject { - public ObservableCollection Entries { get; } + public ObservableCollection Entries { get; private set; } - public ObservableCollection Groups { get; } + public ObservableCollection Groups { get; private set; } public bool IsNotRoot => Database.RootGroupId != _group.Id; @@ -84,7 +83,7 @@ namespace ModernKeePass.ViewModels public bool IsInRecycleBin => _parent != null && _parent.Id == Database.RecycleBinId; - public IEnumerable BreadCrumb { get; } + public IEnumerable BreadCrumb { get; private set; } public RelayCommand SaveCommand { get; } public RelayCommand SortEntriesCommand { get; } @@ -102,34 +101,18 @@ namespace ModernKeePass.ViewModels private readonly INavigationService _navigation; private readonly IDialogService _dialog; private readonly INotificationService _notification; - private readonly GroupVm _group; - private readonly GroupVm _parent; + private GroupVm _group; + private GroupVm _parent; private bool _isEditMode; private EntryVm _reorderedEntry; - - public GroupDetailVm() {} - internal GroupDetailVm(string groupId) : this(groupId, - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService()) - { } - - public GroupDetailVm(string groupId, IMediator mediator, IResourceProxy resource, INavigationService navigation, IDialogService dialog, INotificationService notification) + public GroupDetailVm(IMediator mediator, IResourceProxy resource, INavigationService navigation, IDialogService dialog, INotificationService notification) { _mediator = mediator; _resource = resource; _navigation = navigation; _dialog = dialog; _notification = notification; - _group = _mediator.Send(new GetGroupQuery { Id = groupId }).GetAwaiter().GetResult(); - if (!string.IsNullOrEmpty(_group.ParentGroupId)) - { - _parent = _mediator.Send(new GetGroupQuery { Id = _group.ParentGroupId }).GetAwaiter().GetResult(); - BreadCrumb = new List {_parent}; - } SaveCommand = new RelayCommand(async () => await SaveChanges(), () => Database.IsDirty); SortEntriesCommand = new RelayCommand(async () => await SortEntriesAsync(), () => IsEditMode); @@ -139,32 +122,22 @@ namespace ModernKeePass.ViewModels CreateGroupCommand = new RelayCommand(async () => await AddNewGroup(), () => !IsInRecycleBin && Database.RecycleBinId != Id); DeleteCommand = new RelayCommand(async () => await AskForDelete()); GoBackCommand = new RelayCommand(() => _navigation.GoBack()); + } + + public async Task Initialize(string groupId) + { + _group = await _mediator.Send(new GetGroupQuery { Id = groupId }); + if (!string.IsNullOrEmpty(_group.ParentGroupId)) + { + _parent = await _mediator.Send(new GetGroupQuery { Id = _group.ParentGroupId }); + BreadCrumb = new List { _parent }; + } Entries = new ObservableCollection(_group.Entries); Entries.CollectionChanged += Entries_CollectionChanged; Groups = new ObservableCollection(_group.SubGroups); } - - private async Task AskForDelete() - { - if (IsRecycleOnDelete) - { - await Delete(); - _notification.Show(_resource.GetResourceValue("GroupRecyclingConfirmation"), _resource.GetResourceValue("GroupRecycled")); - } - else - { - await _dialog.ShowMessage(_resource.GetResourceValue("GroupDeletingConfirmation"), _resource.GetResourceValue("EntityDeleteTitle"), - _resource.GetResourceValue("EntityDeleteActionButton"), - _resource.GetResourceValue("EntityDeleteCancelButton"), - async isOk => - { - if (isOk) await Delete(); - }); - } - } - - + public async Task AddNewGroup(string name = "") { var group = await _mediator.Send(new CreateGroupCommand {Name = name, ParentGroup = _group}); @@ -239,6 +212,25 @@ namespace ModernKeePass.ViewModels SaveCommand.RaiseCanExecuteChanged(); } + private async Task AskForDelete() + { + if (IsRecycleOnDelete) + { + await Delete(); + _notification.Show(_resource.GetResourceValue("GroupRecyclingConfirmation"), _resource.GetResourceValue("GroupRecycled")); + } + else + { + await _dialog.ShowMessage(_resource.GetResourceValue("GroupDeletingConfirmation"), _resource.GetResourceValue("EntityDeleteTitle"), + _resource.GetResourceValue("EntityDeleteActionButton"), + _resource.GetResourceValue("EntityDeleteCancelButton"), + async isOk => + { + if (isOk) await Delete(); + }); + } + } + private async Task Delete() { await _mediator.Send(new DeleteGroupCommand diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index f258a7d..6ce27ce 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -5,7 +5,6 @@ using Windows.UI.Xaml.Controls; using GalaSoft.MvvmLight; using MediatR; using Messages; -using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Domain.Dtos; @@ -61,30 +60,13 @@ namespace ModernKeePass.ViewModels } } - public MainVm() {} - - internal MainVm(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile = null) : this( - referenceFrame, - destinationFrame, - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - App.Services.GetRequiredService(), - databaseFile) - { } - public MainVm( - Frame referenceFrame, - Frame destinationFrame, IMediator mediator, IRecentProxy recent, IResourceProxy resource, IDialogService dialog, INotificationService notification, - INavigationService navigation, - FileInfo databaseFile = null) + INavigationService navigation) { _mediator = mediator; _recent = recent; @@ -92,16 +74,14 @@ namespace ModernKeePass.ViewModels _dialog = dialog; _notification = notification; _navigation = navigation; - - BuildMainMenuItems(referenceFrame, destinationFrame, databaseFile); - + MessengerInstance.Register(this, NavigateToPage); MessengerInstance.Register(this, async message => await DisplaySaveConfirmation(message)); } - private void BuildMainMenuItems(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile) + public async Task Initialize(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile = null) { - var database = _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult(); + var database = await _mediator.Send(new GetDatabaseQuery()); var mainMenuItems = new ObservableCollection { new MainMenuItemVm diff --git a/ModernKeePass/Views/EntryDetailPage.xaml b/ModernKeePass/Views/EntryDetailPage.xaml index 52c0aa1..6607c78 100644 --- a/ModernKeePass/Views/EntryDetailPage.xaml +++ b/ModernKeePass/Views/EntryDetailPage.xaml @@ -12,7 +12,8 @@ xmlns:userControls="using:ModernKeePass.Views.UserControls" x:Class="ModernKeePass.Views.EntryDetailPage" mc:Ignorable="d" - SizeChanged="EntryDetailPage_OnSizeChanged"> + SizeChanged="EntryDetailPage_OnSizeChanged" + DataContext="{Binding Source={StaticResource Locator}, Path=Entry}"> @@ -369,9 +370,6 @@ - - - diff --git a/ModernKeePass/Views/EntryDetailPage.xaml.cs b/ModernKeePass/Views/EntryDetailPage.xaml.cs index 09b6e7a..2862522 100644 --- a/ModernKeePass/Views/EntryDetailPage.xaml.cs +++ b/ModernKeePass/Views/EntryDetailPage.xaml.cs @@ -27,7 +27,8 @@ namespace ModernKeePass.Views var args = e.Parameter as NavigationItem; if (args != null) { - DataContext = new EntryDetailVm(args.Id) { IsEditMode = args.IsNew }; + await Model.Initialize(args.Id); + Model.IsEditMode = args.IsNew; if (args.IsNew) await Model.GeneratePassword(); } } diff --git a/ModernKeePass/Views/GroupDetailPage.xaml b/ModernKeePass/Views/GroupDetailPage.xaml index 1ba8306..0050846 100644 --- a/ModernKeePass/Views/GroupDetailPage.xaml +++ b/ModernKeePass/Views/GroupDetailPage.xaml @@ -3,25 +3,21 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:converters="using:ModernKeePass.Converters" xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:core="using:Microsoft.Xaml.Interactions.Core" xmlns:actions="using:ModernKeePass.Actions" xmlns:userControls="using:ModernKeePass.Views.UserControls" - x:Name="PageRoot" x:Class="ModernKeePass.Views.GroupDetailPage" mc:Ignorable="d" - SizeChanged="GroupDetailPage_OnSizeChanged"> + SizeChanged="GroupDetailPage_OnSizeChanged" + DataContext="{Binding Source={StaticResource Locator}, Path=Group}"> - - - public sealed partial class GroupDetailPage { - private readonly IResourceProxy _resource; private readonly INavigationService _navigation; public GroupDetailVm Model => (GroupDetailVm)DataContext; - public GroupDetailPage(): this (App.Services.GetRequiredService(), App.Services.GetRequiredService()) { } - public GroupDetailPage(IResourceProxy resource, INavigationService navigation) + public GroupDetailPage(): this (App.Services.GetRequiredService()) { } + public GroupDetailPage(INavigationService navigation) { InitializeComponent(); - _resource = resource; _navigation = navigation; } #region NavigationHelper registration - protected override void OnNavigatedTo(NavigationEventArgs e) + protected override async void OnNavigatedTo(NavigationEventArgs e) { var navigationItem = e.Parameter as NavigationItem; if (navigationItem != null) - DataContext = new GroupDetailVm(navigationItem.Id) { IsEditMode = navigationItem.IsNew }; + { + await Model.Initialize(navigationItem.Id); + Model.IsEditMode = navigationItem.IsNew; + } } #endregion diff --git a/ModernKeePass/Views/MainPage.xaml b/ModernKeePass/Views/MainPage.xaml index 6afd265..68949ba 100644 --- a/ModernKeePass/Views/MainPage.xaml +++ b/ModernKeePass/Views/MainPage.xaml @@ -3,12 +3,12 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:controls="using:ModernKeePass.Controls" xmlns:basePages="using:ModernKeePass.Views.BasePages" x:Class="ModernKeePass.Views.MainPage" x:Name="PageRoot" - mc:Ignorable="d"> + mc:Ignorable="d" + DataContext="{Binding Source={StaticResource Locator}, Path=Main}"> - - - diff --git a/ModernKeePass/Views/MainPage.xaml.cs b/ModernKeePass/Views/MainPage.xaml.cs index a582287..83bfb79 100644 --- a/ModernKeePass/Views/MainPage.xaml.cs +++ b/ModernKeePass/Views/MainPage.xaml.cs @@ -37,11 +37,11 @@ namespace ModernKeePass.Views else selectedItem.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter); } - protected override void OnNavigatedTo(NavigationEventArgs e) + protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); var file = e.Parameter as FileInfo; - DataContext = new MainVm(Frame, MenuFrame, file); + await Model.Initialize(Frame, MenuFrame, file); } } } diff --git a/ModernKeePass10/App.xaml.cs b/ModernKeePass10/App.xaml.cs index 6b2afcb..33de2b3 100644 --- a/ModernKeePass10/App.xaml.cs +++ b/ModernKeePass10/App.xaml.cs @@ -11,11 +11,9 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; using UnhandledExceptionEventArgs = Windows.UI.Xaml.UnhandledExceptionEventArgs; -using Autofac; using Microsoft.AppCenter; using Microsoft.AppCenter.Analytics; using ModernKeePass.Common; -using ModernKeePass.Composition; using ModernKeePass.Domain.Dtos; using ModernKeePass.Domain.Exceptions; using ModernKeePass.Domain.Interfaces; @@ -30,10 +28,6 @@ namespace ModernKeePass /// sealed partial class App { - private readonly IDatabaseService _databaseService; - - public static IContainer Container { get; set; } - /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). @@ -48,12 +42,7 @@ namespace ModernKeePass UnhandledException += OnUnhandledException; // Setup DI - var builder = new ContainerBuilder(); - builder.RegisterModule(); - builder.RegisterModule(); - Container = builder.Build(); - _databaseService = Container.Resolve(); } #region Event Handlers diff --git a/ModernKeePass10/Win10App.csproj b/ModernKeePass10/Win10App.csproj index 82a2919..4226156 100644 --- a/ModernKeePass10/Win10App.csproj +++ b/ModernKeePass10/Win10App.csproj @@ -23,6 +23,8 @@ neutral Always win10-arm;win10-arm-aot;win10-x86;win10-x86-aot;win10-x64;win10-x64-aot + + true @@ -432,23 +434,6 @@ - - - 3.0.0 - - - 6.2.9 - - - 6.0.0 - - - 2.3.200213001 - - - 2.0.1 - - {42353562-5e43-459c-8e3e-2f21e575261d} diff --git a/WinAppCommon/ViewModels/ViewModelLocator.cs b/WinAppCommon/ViewModels/ViewModelLocator.cs index e330eb7..a7237d9 100644 --- a/WinAppCommon/ViewModels/ViewModelLocator.cs +++ b/WinAppCommon/ViewModels/ViewModelLocator.cs @@ -63,10 +63,13 @@ namespace ModernKeePass.ViewModels SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); + SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); + SimpleIoc.Default.Register(); + SimpleIoc.Default.Register(); } public MainVm Main => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); @@ -81,6 +84,8 @@ namespace ModernKeePass.ViewModels public OpenVm Open => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); public RecentVm Recent => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); public SaveVm Save => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); + public GroupDetailVm Group => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); + public EntryDetailVm Entry => ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString()); public static void Cleanup() {