diff --git a/samples/Lemon.ModuleNavigation.Sample/ViewModels/MainViewModel.cs b/samples/Lemon.ModuleNavigation.Sample/ViewModels/MainViewModel.cs index 00c01ef..b8427ca 100644 --- a/samples/Lemon.ModuleNavigation.Sample/ViewModels/MainViewModel.cs +++ b/samples/Lemon.ModuleNavigation.Sample/ViewModels/MainViewModel.cs @@ -47,8 +47,7 @@ public MainViewModel(IEnumerable modules, new NavigationParameters { { "requestNew", requestNew } }); _navigationService.RequestViewNavigation("TabRegion", viewName, - new NavigationParameters { { "requestNew", requestNew } }, - $"alias-{viewName}"); + new NavigationParameters { { "requestNew", requestNew } }); _navigationService.RequestViewNavigation("ItemsRegion", viewName, new NavigationParameters { { "requestNew", requestNew } }); diff --git a/samples/Lemon.ModuleNavigation.SampleViewModel/BaseNavigationViewModel.cs b/samples/Lemon.ModuleNavigation.SampleViewModel/BaseNavigationViewModel.cs index 6ea7573..ba00b90 100644 --- a/samples/Lemon.ModuleNavigation.SampleViewModel/BaseNavigationViewModel.cs +++ b/samples/Lemon.ModuleNavigation.SampleViewModel/BaseNavigationViewModel.cs @@ -8,7 +8,7 @@ namespace Lemon.ModuleNavigation.SampleViewModel; public class BaseNavigationViewModel : ReactiveObject, INavigationAware, ICanUnload { public virtual string Greeting => $"Welcome to {GetType().Name}[{Environment.ProcessId}][{Environment.CurrentManagedThreadId}]{Environment.NewLine}{DateTime.Now:yyyy-MM-dd HH-mm-ss.ffff}"; - + public virtual string? Alias => GetType().Name; public BaseNavigationViewModel() { UnloadViewCommand = ReactiveCommand.Create(() => diff --git a/samples/Lemon.ModuleNavigation.SampleViewModel/MainWindowViewModel.cs b/samples/Lemon.ModuleNavigation.SampleViewModel/MainWindowViewModel.cs index a443695..4466298 100644 --- a/samples/Lemon.ModuleNavigation.SampleViewModel/MainWindowViewModel.cs +++ b/samples/Lemon.ModuleNavigation.SampleViewModel/MainWindowViewModel.cs @@ -33,7 +33,7 @@ public MainWindowViewModel(INavigationService navigationService, } _navigationService.RequestViewNavigation("ContentRegion", viewName, new NavigationParameters { { "requestNew", requestNew } }); - _navigationService.RequestViewNavigation("TabRegion", viewName, new NavigationParameters { { "requestNew", requestNew } }, $"alias-{viewName}"); + _navigationService.RequestViewNavigation("TabRegion", viewName, new NavigationParameters { { "requestNew", requestNew } }); _navigationService.RequestViewNavigation("ItemsRegion", viewName, new NavigationParameters { { "requestNew", requestNew } }); }); diff --git a/samples/Lemon.ModuleNavigation.SampleViewModel/ViewAlphaViewModel.cs b/samples/Lemon.ModuleNavigation.SampleViewModel/ViewAlphaViewModel.cs index 9d70cb8..ee5dce6 100644 --- a/samples/Lemon.ModuleNavigation.SampleViewModel/ViewAlphaViewModel.cs +++ b/samples/Lemon.ModuleNavigation.SampleViewModel/ViewAlphaViewModel.cs @@ -11,6 +11,7 @@ public ViewAlphaViewModel() { } + public override string? Alias => "AlphaView"; public string Title => nameof(ViewAlphaViewModel); public event Action? RequestClose; diff --git a/samples/Lemon.ModuleNavigation.SampleViewModel/ViewBetaViewModel.cs b/samples/Lemon.ModuleNavigation.SampleViewModel/ViewBetaViewModel.cs index 32a86b5..bc03bfb 100644 --- a/samples/Lemon.ModuleNavigation.SampleViewModel/ViewBetaViewModel.cs +++ b/samples/Lemon.ModuleNavigation.SampleViewModel/ViewBetaViewModel.cs @@ -8,7 +8,7 @@ namespace Lemon.ModuleNavigation.SampleViewModel; public class ViewBetaViewModel : BaseNavigationViewModel, IDialogAware { public string Title => nameof(ViewBetaViewModel); - + public override string? Alias => "BetaView"; public event Action? RequestClose; public ReactiveCommand CloseCommand => ReactiveCommand.Create(() => { diff --git a/src/Lemon.ModuleNavigation.Avaloniaui/Regions/Region.cs b/src/Lemon.ModuleNavigation.Avaloniaui/Regions/Region.cs index 2899252..ffb8f7d 100644 --- a/src/Lemon.ModuleNavigation.Avaloniaui/Regions/Region.cs +++ b/src/Lemon.ModuleNavigation.Avaloniaui/Regions/Region.cs @@ -140,6 +140,7 @@ private IDataTemplate CreateRegionDataTemplate() view.DataContext = navigationAware; navigationAware.OnNavigatedTo(context); + context.Alias = navigationAware.Alias; if (navigationAware is ICanUnload canUnloadNavigationAware) { canUnloadNavigationAware.RequestUnload += () => diff --git a/src/Lemon.ModuleNavigation.Wpf/Regions/Region.cs b/src/Lemon.ModuleNavigation.Wpf/Regions/Region.cs index ed19e79..253d149 100644 --- a/src/Lemon.ModuleNavigation.Wpf/Regions/Region.cs +++ b/src/Lemon.ModuleNavigation.Wpf/Regions/Region.cs @@ -80,6 +80,7 @@ public virtual void ScrollIntoView(NavigationContext item) view.DataContext = navigationAware; navigationAware.OnNavigatedTo(context); + context.Alias = navigationAware.Alias; if (navigationAware is ICanUnload canUnloadNavigationAware) { canUnloadNavigationAware.RequestUnload += () => diff --git a/src/Lemon.ModuleNavigation/Abstractions/INavigationAware.cs b/src/Lemon.ModuleNavigation/Abstractions/INavigationAware.cs index f77ed78..e88db0c 100644 --- a/src/Lemon.ModuleNavigation/Abstractions/INavigationAware.cs +++ b/src/Lemon.ModuleNavigation/Abstractions/INavigationAware.cs @@ -2,6 +2,7 @@ public interface INavigationAware { + string? Alias { get; } void OnNavigatedTo(NavigationContext navigationContext); bool IsNavigationTarget(NavigationContext navigationContext); void OnNavigatedFrom(NavigationContext navigationContext); diff --git a/src/Lemon.ModuleNavigation/Abstractions/IRegionManager.cs b/src/Lemon.ModuleNavigation/Abstractions/IRegionManager.cs index 63c5942..5654132 100644 --- a/src/Lemon.ModuleNavigation/Abstractions/IRegionManager.cs +++ b/src/Lemon.ModuleNavigation/Abstractions/IRegionManager.cs @@ -6,7 +6,7 @@ public interface IRegionManager : IObservable, IObservable /// RequestViewNavigation @@ -41,8 +40,7 @@ void RequestViewNavigation(string regionName, void RequestViewNavigation(string regionName, string viewName, - NavigationParameters parameters, - string? alias = null); + NavigationParameters parameters); /// /// RequestViewUnload diff --git a/src/Lemon.ModuleNavigation/NavigationContext.cs b/src/Lemon.ModuleNavigation/NavigationContext.cs index 6e526b4..1a23981 100644 --- a/src/Lemon.ModuleNavigation/NavigationContext.cs +++ b/src/Lemon.ModuleNavigation/NavigationContext.cs @@ -1,12 +1,14 @@ using Lemon.ModuleNavigation.Abstractions; using Lemon.ModuleNavigation.Core; +using System.ComponentModel; +using System.Runtime.CompilerServices; namespace Lemon.ModuleNavigation; -public class NavigationContext +public class NavigationContext : INotifyPropertyChanged { [Obsolete("requestNew was obsolete.Consider IsNavigationTarget() in INavigationAware instead.")] - internal NavigationContext(string viewName, + internal NavigationContext(string viewName, string regionName, IServiceProvider serviceProvider, bool requestNew, @@ -21,32 +23,35 @@ internal NavigationContext(string viewName, internal NavigationContext(string viewName, string regionName, IServiceProvider serviceProvider, - NavigationParameters? navigationParameters, - string? alias) + NavigationParameters? navigationParameters) { ViewName = viewName; Parameters = navigationParameters; RegionName = regionName; ServiceProvider = serviceProvider; - Alias = alias; } public static ViewNameComparer ViewNameComparer => new(); public static StrictComparer StrictComparer => new(); - public string ViewName - { - get; - private set; + public string ViewName + { + get; + private set; } + private string? _alias; public string? Alias + { + get => _alias; + set + { + _alias = value; + OnPropertyChanged(); + } + } + public NavigationParameters? Parameters { get; private set; } - public NavigationParameters? Parameters - { - get; - private set; - } [Obsolete("requestNew was obsolete.Consider IsNavigationTarget() in INavigationAware instead.")] public bool RequestNew { @@ -54,9 +59,9 @@ public bool RequestNew private set; } public string RegionName - { - get; - private set; + { + get; + private set; } public int Key => GetHashCode(); public IServiceProvider ServiceProvider @@ -72,6 +77,12 @@ public override string ToString() { return $"{RegionName}.{ViewName}"; } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } public class ViewNameComparer : IEqualityComparer { diff --git a/src/Lemon.ModuleNavigation/NavigationHandler.cs b/src/Lemon.ModuleNavigation/NavigationHandler.cs index 6d19f44..da2d2bb 100644 --- a/src/Lemon.ModuleNavigation/NavigationHandler.cs +++ b/src/Lemon.ModuleNavigation/NavigationHandler.cs @@ -33,17 +33,15 @@ public void OnNavigateTo(string moduleKey, NavigationParameters? parameters) _moduleManager.RequestNavigate(moduleKey, parameters); } public void OnNavigateTo(string regionName, - string viewName, - string? alias = null) + string viewName) { - RegionManager.RequestViewNavigate(regionName, viewName, null, alias); + RegionManager.RequestViewNavigate(regionName, viewName, null); } public void OnNavigateTo(string regionName, string viewName, - NavigationParameters navigationParameters, - string? alias = null) + NavigationParameters navigationParameters) { - RegionManager.RequestViewNavigate(regionName, viewName, navigationParameters, alias); + RegionManager.RequestViewNavigate(regionName, viewName, navigationParameters); } public void OnViewUnload(string regionName, string viewName) diff --git a/src/Lemon.ModuleNavigation/NavigationService.cs b/src/Lemon.ModuleNavigation/NavigationService.cs index 697ad4c..502402f 100644 --- a/src/Lemon.ModuleNavigation/NavigationService.cs +++ b/src/Lemon.ModuleNavigation/NavigationService.cs @@ -40,23 +40,21 @@ public void RequestModuleNavigate(string moduleName, NavigationParameters? param _bufferModuleName.Push((moduleName, parameters)); } public void RequestViewNavigation(string regionName, - string viewName, - string? alias = null) + string viewName) { foreach (var handler in _viewHandlers) { - handler.OnNavigateTo(regionName, viewName, alias); + handler.OnNavigateTo(regionName, viewName); } _bufferViewName.Push((regionName, viewName, null)); } public void RequestViewNavigation(string regionName, string viewName, - NavigationParameters parameters, - string? alias = null) + NavigationParameters parameters) { foreach (var handler in _viewHandlers) { - handler.OnNavigateTo(regionName, viewName, parameters, alias); + handler.OnNavigateTo(regionName, viewName, parameters); } _bufferViewName.Push((regionName, viewName, parameters)); } diff --git a/src/Lemon.ModuleNavigation/RegionManager.cs b/src/Lemon.ModuleNavigation/RegionManager.cs index 30fd7c3..a26575d 100644 --- a/src/Lemon.ModuleNavigation/RegionManager.cs +++ b/src/Lemon.ModuleNavigation/RegionManager.cs @@ -41,9 +41,9 @@ public void RequestNavigate(string regionName, string viewName, bool requestNew, }); } } - public void RequestViewNavigate(string regionName, string viewName, NavigationParameters? parameters = null, string? alias = null) + public void RequestViewNavigate(string regionName, string viewName, NavigationParameters? parameters = null) { - var context = new NavigationContext(viewName, regionName, _serviceProvider, parameters, alias); + var context = new NavigationContext(viewName, regionName, _serviceProvider, parameters); if (_regions.TryGetValue(regionName, out var region)) { region.Activate(context);