mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 15:40:18 -04:00
WIP
This commit is contained in:
@@ -58,6 +58,7 @@
|
|||||||
<Compile Include="Database\Commands\CloseDatabase\CloseDatabaseCommand.cs" />
|
<Compile Include="Database\Commands\CloseDatabase\CloseDatabaseCommand.cs" />
|
||||||
<Compile Include="Database\Commands\CreateDatabase\CreateDatabaseCommand.cs" />
|
<Compile Include="Database\Commands\CreateDatabase\CreateDatabaseCommand.cs" />
|
||||||
<Compile Include="Database\Commands\SaveDatabase\SaveDatabaseCommand.cs" />
|
<Compile Include="Database\Commands\SaveDatabase\SaveDatabaseCommand.cs" />
|
||||||
|
<Compile Include="Database\Commands\UpdateCredentials\UpdateCredentialsCommand.cs" />
|
||||||
<Compile Include="Database\Models\DatabaseVm.cs" />
|
<Compile Include="Database\Models\DatabaseVm.cs" />
|
||||||
<Compile Include="Database\Models\MainVm.cs" />
|
<Compile Include="Database\Models\MainVm.cs" />
|
||||||
<Compile Include="Database\Queries\GetDatabase\GetDatabaseQuery.cs" />
|
<Compile Include="Database\Queries\GetDatabase\GetDatabaseQuery.cs" />
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using MediatR;
|
using MediatR;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
using ModernKeePass.Application.Common.Interfaces;
|
||||||
using ModernKeePass.Application.Database.Queries.IsDatabaseOpen;
|
using ModernKeePass.Application.Database.Queries.IsDatabaseOpen;
|
||||||
|
@@ -0,0 +1,33 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using MediatR;
|
||||||
|
using ModernKeePass.Application.Common.Interfaces;
|
||||||
|
using ModernKeePass.Application.Database.Queries.IsDatabaseOpen;
|
||||||
|
using ModernKeePass.Domain.Dtos;
|
||||||
|
using ModernKeePass.Domain.Exceptions;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Application.Database.Commands.UpdateCredentials
|
||||||
|
{
|
||||||
|
public class UpdateCredentialsCommand: IRequest
|
||||||
|
{
|
||||||
|
public Credentials Credentials { get; set; }
|
||||||
|
|
||||||
|
public class UpdateCredentialsCommandHandler : IAsyncRequestHandler<UpdateCredentialsCommand>
|
||||||
|
{
|
||||||
|
private readonly IDatabaseProxy _database;
|
||||||
|
private readonly IMediator _mediator;
|
||||||
|
|
||||||
|
public UpdateCredentialsCommandHandler(IDatabaseProxy database, IMediator mediator)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
_mediator = mediator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Handle(UpdateCredentialsCommand message)
|
||||||
|
{
|
||||||
|
var isDatabaseOpen = await _mediator.Send(new IsDatabaseOpenQuery());
|
||||||
|
if (isDatabaseOpen) await _database.UpdateCredentials(message.Credentials);
|
||||||
|
else throw new DatabaseClosedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -25,11 +25,37 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
private string _fileAccessToken;
|
private string _fileAccessToken;
|
||||||
private CompositeKey _compositeKey;
|
private CompositeKey _compositeKey;
|
||||||
|
|
||||||
|
// Main information
|
||||||
public bool IsOpen => (_pwDatabase?.IsOpen).GetValueOrDefault();
|
public bool IsOpen => (_pwDatabase?.IsOpen).GetValueOrDefault();
|
||||||
public string Name => _pwDatabase?.Name;
|
public string Name => _pwDatabase?.Name;
|
||||||
|
public GroupEntity RootGroup { get; set; }
|
||||||
|
|
||||||
public GroupEntity RecycleBin { get; set; }
|
// Settings
|
||||||
|
public GroupEntity RecycleBin
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_pwDatabase.RecycleBinEnabled)
|
||||||
|
{
|
||||||
|
var pwGroup = _pwDatabase.RootGroup.FindGroup(_pwDatabase.RecycleBinUuid, true);
|
||||||
|
var group = new GroupEntity
|
||||||
|
{
|
||||||
|
Id = pwGroup.Uuid.ToHexString(),
|
||||||
|
Name = pwGroup.Name,
|
||||||
|
Icon = IconMapper.MapPwIconToIcon(pwGroup.IconId),
|
||||||
|
Entries = pwGroup.Entries.Select(e => _mapper.Map<EntryEntity>(e)).ToList(),
|
||||||
|
SubGroups = pwGroup.Groups.Select(BuildHierarchy).ToList()
|
||||||
|
};
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public BaseEntity Cipher
|
public BaseEntity Cipher
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -88,6 +114,7 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
|
|
||||||
return new DatabaseEntity
|
return new DatabaseEntity
|
||||||
{
|
{
|
||||||
|
Name = _pwDatabase.Name,
|
||||||
RootGroupEntity = BuildHierarchy(_pwDatabase.RootGroup)
|
RootGroupEntity = BuildHierarchy(_pwDatabase.RootGroup)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,7 @@ namespace ModernKeePass
|
|||||||
{
|
{
|
||||||
public IServiceProvider Services { get; }
|
public IServiceProvider Services { get; }
|
||||||
|
|
||||||
private IMediator _mediator;
|
public static IMediator Mediator { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the singleton application object. This is the first line of authored code
|
/// Initializes the singleton application object. This is the first line of authored code
|
||||||
@@ -58,7 +58,7 @@ namespace ModernKeePass
|
|||||||
serviceCollection.AddApplication();
|
serviceCollection.AddApplication();
|
||||||
serviceCollection.AddInfrastructure();
|
serviceCollection.AddInfrastructure();
|
||||||
Services = serviceCollection.BuildServiceProvider();
|
Services = serviceCollection.BuildServiceProvider();
|
||||||
_mediator = Services.GetService<IMediator>();
|
Mediator = Services.GetService<IMediator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Event Handlers
|
#region Event Handlers
|
||||||
@@ -83,7 +83,7 @@ namespace ModernKeePass
|
|||||||
resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
|
resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
|
||||||
async command =>
|
async command =>
|
||||||
{
|
{
|
||||||
var database = await _mediator.Send(new GetDatabaseQuery());
|
var database = await Mediator.Send(new GetDatabaseQuery());
|
||||||
var savePicker = new FileSavePicker
|
var savePicker = new FileSavePicker
|
||||||
{
|
{
|
||||||
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
|
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
|
||||||
@@ -101,7 +101,7 @@ namespace ModernKeePass
|
|||||||
Name = file.DisplayName,
|
Name = file.DisplayName,
|
||||||
Path = token
|
Path = token
|
||||||
};
|
};
|
||||||
await _mediator.Send(new SaveDatabaseCommand { FileInfo = fileInfo });
|
await Mediator.Send(new SaveDatabaseCommand { FileInfo = fileInfo });
|
||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
@@ -171,7 +171,7 @@ namespace ModernKeePass
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var database = await _mediator.Send(new GetDatabaseQuery());
|
var database = await Mediator.Send(new GetDatabaseQuery());
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
ToastNotificationHelper.ShowGenericToast(database.Name, "Database reopened (changes were saved)");
|
ToastNotificationHelper.ShowGenericToast(database.Name, "Database reopened (changes were saved)");
|
||||||
#endif
|
#endif
|
||||||
@@ -207,12 +207,12 @@ namespace ModernKeePass
|
|||||||
var deferral = e.SuspendingOperation.GetDeferral();
|
var deferral = e.SuspendingOperation.GetDeferral();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var database = await _mediator.Send(new GetDatabaseQuery());
|
var database = await Mediator.Send(new GetDatabaseQuery());
|
||||||
if (SettingsService.Instance.GetSetting("SaveSuspend", true))
|
if (SettingsService.Instance.GetSetting("SaveSuspend", true))
|
||||||
{
|
{
|
||||||
await _mediator.Send(new SaveDatabaseCommand());
|
await Mediator.Send(new SaveDatabaseCommand());
|
||||||
}
|
}
|
||||||
await _mediator.Send(new CloseDatabaseCommand());
|
await Mediator.Send(new CloseDatabaseCommand());
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
@@ -3,12 +3,16 @@ using System.Runtime.InteropServices.WindowsRuntime;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
|
using Windows.Storage.AccessCache;
|
||||||
|
using MediatR;
|
||||||
|
using ModernKeePass.Application.Database.Commands.UpdateCredentials;
|
||||||
|
using ModernKeePass.Application.Database.Queries.OpenDatabase;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Domain.Dtos;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib.Cryptography;
|
using ModernKeePassLib.Cryptography;
|
||||||
using ModernKeePassLib.Keys;
|
using ModernKeePassLib.Keys;
|
||||||
using ModernKeePassLib.Serialization;
|
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
@@ -21,9 +25,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Warning = 3,
|
Warning = 3,
|
||||||
Success = 5
|
Success = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDatabaseService Database { get; set; }
|
|
||||||
|
|
||||||
public bool HasPassword
|
public bool HasPassword
|
||||||
{
|
{
|
||||||
get { return _hasPassword; }
|
get { return _hasPassword; }
|
||||||
@@ -110,15 +112,16 @@ namespace ModernKeePass.ViewModels
|
|||||||
private StatusTypes _statusType;
|
private StatusTypes _statusType;
|
||||||
private StorageFile _keyFile;
|
private StorageFile _keyFile;
|
||||||
private string _keyFileText;
|
private string _keyFileText;
|
||||||
|
private readonly IMediator _mediator;
|
||||||
private readonly IResourceService _resource;
|
private readonly IResourceService _resource;
|
||||||
|
|
||||||
public CompositeKeyVm() : this(DatabaseService.Instance, new ResourcesService()) { }
|
public CompositeKeyVm() : this(App.Mediator, new ResourcesService()) { }
|
||||||
|
|
||||||
public CompositeKeyVm(IDatabaseService database, IResourceService resource)
|
public CompositeKeyVm(IMediator mediator, IResourceService resource)
|
||||||
{
|
{
|
||||||
|
_mediator = mediator;
|
||||||
_resource = resource;
|
_resource = resource;
|
||||||
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
|
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
|
||||||
Database = database;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> OpenDatabase(StorageFile databaseFile, bool createNew)
|
public async Task<bool> OpenDatabase(StorageFile databaseFile, bool createNew)
|
||||||
@@ -126,9 +129,15 @@ namespace ModernKeePass.ViewModels
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
_isOpening = true;
|
_isOpening = true;
|
||||||
OnPropertyChanged("IsValid");
|
OnPropertyChanged("IsValid");;
|
||||||
await Database.Open(databaseFile, await CreateCompositeKey(), createNew);
|
var fileInfo = new FileInfo
|
||||||
await Task.Run(() => RootGroup = Database.RootGroup);
|
{
|
||||||
|
Name = databaseFile.DisplayName,
|
||||||
|
Path = StorageApplicationPermissions.FutureAccessList.Add(databaseFile)
|
||||||
|
};
|
||||||
|
|
||||||
|
var database = await _mediator.Send(new OpenDatabaseQuery { FileInfo = fileInfo, Credentials = CreateCredentials()});
|
||||||
|
await Task.Run(() => RootGroup = new GroupVm(database.RootGroup));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (ArgumentException)
|
catch (ArgumentException)
|
||||||
@@ -154,7 +163,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public async Task UpdateKey()
|
public async Task UpdateKey()
|
||||||
{
|
{
|
||||||
Database.UpdateCompositeKey(await CreateCompositeKey());
|
//Database.UpdateCompositeKey(await CreateCompositeKey());
|
||||||
|
await _mediator.Send(new UpdateCredentialsCommand {Credentials = CreateCredentials()});
|
||||||
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
|
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,17 +182,14 @@ namespace ModernKeePass.ViewModels
|
|||||||
StatusType = (int)type;
|
StatusType = (int)type;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<CompositeKey> CreateCompositeKey()
|
private Credentials CreateCredentials()
|
||||||
{
|
{
|
||||||
var compositeKey = new CompositeKey();
|
var credentials = new Credentials
|
||||||
if (HasPassword) compositeKey.AddUserKey(new KcpPassword(Password));
|
|
||||||
if (HasKeyFile && KeyFile != null)
|
|
||||||
{
|
{
|
||||||
var fileContents = await FileIO.ReadBufferAsync(KeyFile);
|
Password = HasPassword ? Password: null,
|
||||||
compositeKey.AddUserKey(new KcpKeyFile(IOConnectionInfo.FromByteArray(fileContents.ToArray())));
|
KeyFilePath = HasKeyFile && KeyFile != null ? StorageApplicationPermissions.FutureAccessList.Add(KeyFile) : null
|
||||||
}
|
};
|
||||||
if (HasUserAccount) compositeKey.AddUserKey(new KcpUserAccount());
|
return credentials;
|
||||||
return compositeKey;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,8 @@ using System.Linq;
|
|||||||
using Windows.ApplicationModel;
|
using Windows.ApplicationModel;
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using MediatR;
|
||||||
|
using ModernKeePass.Application.Database.Queries.GetDatabase;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
@@ -46,12 +48,12 @@ namespace ModernKeePass.ViewModels
|
|||||||
public MainVm() {}
|
public MainVm() {}
|
||||||
|
|
||||||
internal MainVm(Frame referenceFrame, Frame destinationFrame, StorageFile databaseFile = null) : this(referenceFrame, destinationFrame,
|
internal MainVm(Frame referenceFrame, Frame destinationFrame, StorageFile databaseFile = null) : this(referenceFrame, destinationFrame,
|
||||||
DatabaseService.Instance, new ResourcesService(), RecentService.Instance, databaseFile)
|
App.Mediator, new ResourcesService(), RecentService.Instance, databaseFile)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabaseService database, IResourceService resource, IRecentService recent, StorageFile databaseFile = null)
|
public MainVm(Frame referenceFrame, Frame destinationFrame, IMediator mediator, IResourceService resource, IRecentService recent, StorageFile databaseFile = null)
|
||||||
{
|
{
|
||||||
var isDatabaseOpen = database != null && database.IsOpen;
|
var database = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
|
||||||
|
|
||||||
var mainMenuItems = new ObservableCollection<MainMenuItemVm>
|
var mainMenuItems = new ObservableCollection<MainMenuItemVm>
|
||||||
{
|
{
|
||||||
@@ -79,8 +81,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
Destination = destinationFrame,
|
Destination = destinationFrame,
|
||||||
Parameter = referenceFrame,
|
Parameter = referenceFrame,
|
||||||
SymbolIcon = Symbol.Save,
|
SymbolIcon = Symbol.Save,
|
||||||
IsSelected = isDatabaseOpen,
|
IsSelected = database.IsOpen,
|
||||||
IsEnabled = isDatabaseOpen
|
IsEnabled = database.IsOpen
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
@@ -89,9 +91,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Destination = destinationFrame,
|
Destination = destinationFrame,
|
||||||
Parameter = referenceFrame,
|
Parameter = referenceFrame,
|
||||||
SymbolIcon = Symbol.Copy,
|
SymbolIcon = Symbol.Copy,
|
||||||
IsSelected =
|
IsSelected = !database.IsOpen && recent.EntryCount > 0,
|
||||||
(database == null || !database.IsOpen) &&
|
|
||||||
recent.EntryCount > 0,
|
|
||||||
IsEnabled = recent.EntryCount > 0
|
IsEnabled = recent.EntryCount > 0
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
@@ -120,7 +120,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
||||||
|
|
||||||
// Add currently opened database to the menu
|
// Add currently opened database to the menu
|
||||||
if (database != null && database.IsOpen)
|
if (database.IsOpen)
|
||||||
mainMenuItems.Add(new MainMenuItemVm
|
mainMenuItems.Add(new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = database.Name,
|
Title = database.Name,
|
||||||
|
@@ -6,6 +6,10 @@ using Windows.Storage.Pickers;
|
|||||||
using Windows.System;
|
using Windows.System;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Input;
|
using Windows.UI.Xaml.Input;
|
||||||
|
using MediatR;
|
||||||
|
using ModernKeePass.Application.Database.Commands.CloseDatabase;
|
||||||
|
using ModernKeePass.Application.Database.Commands.SaveDatabase;
|
||||||
|
using ModernKeePass.Application.Database.Queries.GetDatabase;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Events;
|
using ModernKeePass.Events;
|
||||||
using ModernKeePass.Extensions;
|
using ModernKeePass.Extensions;
|
||||||
@@ -19,6 +23,7 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
{
|
{
|
||||||
public sealed partial class CompositeKeyUserControl
|
public sealed partial class CompositeKeyUserControl
|
||||||
{
|
{
|
||||||
|
private readonly IMediator _mediator;
|
||||||
public CompositeKeyVm Model => Grid.DataContext as CompositeKeyVm;
|
public CompositeKeyVm Model => Grid.DataContext as CompositeKeyVm;
|
||||||
|
|
||||||
public bool CreateNew
|
public bool CreateNew
|
||||||
@@ -71,8 +76,12 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
|
|
||||||
public bool ShowComplexityIndicator => CreateNew || UpdateKey;
|
public bool ShowComplexityIndicator => CreateNew || UpdateKey;
|
||||||
|
|
||||||
public CompositeKeyUserControl()
|
public CompositeKeyUserControl(): this(App.Mediator)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public CompositeKeyUserControl(IMediator mediator)
|
||||||
{
|
{
|
||||||
|
_mediator = mediator;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +99,7 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var database = DatabaseService.Instance;
|
var database = await _mediator.Send(new GetDatabaseQuery());
|
||||||
var resource = new ResourcesService();
|
var resource = new ResourcesService();
|
||||||
if (database.IsOpen)
|
if (database.IsOpen)
|
||||||
{
|
{
|
||||||
@@ -100,16 +109,16 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
resource.GetResourceValue("MessageDialogDBOpenButtonDiscard"),
|
resource.GetResourceValue("MessageDialogDBOpenButtonDiscard"),
|
||||||
async command =>
|
async command =>
|
||||||
{
|
{
|
||||||
database.Save();
|
await _mediator.Send(new SaveDatabaseCommand());
|
||||||
ToastNotificationHelper.ShowGenericToast(
|
ToastNotificationHelper.ShowGenericToast(
|
||||||
database.Name,
|
database.Name,
|
||||||
resource.GetResourceValue("ToastSavedMessage"));
|
resource.GetResourceValue("ToastSavedMessage"));
|
||||||
database.Close(false);
|
await _mediator.Send(new CloseDatabaseCommand());
|
||||||
await OpenDatabase(resource);
|
await OpenDatabase(resource);
|
||||||
},
|
},
|
||||||
async command =>
|
async command =>
|
||||||
{
|
{
|
||||||
database.Close(false);
|
await _mediator.Send(new CloseDatabaseCommand());
|
||||||
await OpenDatabase(resource);
|
await OpenDatabase(resource);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -133,7 +133,7 @@
|
|||||||
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
|
||||||
<DependentUpon>DonatePage.xaml</DependentUpon>
|
<DependentUpon>DonatePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Services\DatabaseService.cs" />
|
<Content Include="Services\DatabaseService.cs" />
|
||||||
<Compile Include="Interfaces\ISettingsService.cs" />
|
<Compile Include="Interfaces\ISettingsService.cs" />
|
||||||
<Compile Include="Common\MessageDialogHelper.cs" />
|
<Compile Include="Common\MessageDialogHelper.cs" />
|
||||||
<Compile Include="Common\NavigationHelper.cs" />
|
<Compile Include="Common\NavigationHelper.cs" />
|
||||||
|
Reference in New Issue
Block a user