diff --git a/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs b/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs index 750bde4..641838d 100644 --- a/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs +++ b/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs @@ -15,9 +15,10 @@ public interface ITinyViewModel : INotifyPropertyChanged Task Initialize(); /// - /// This method will run after navigating back. + /// This method runs when navigation parameters are set. /// - Task Returning(); + /// + Task ParameterSet(); /// /// This method will run every time the view is apperaing. @@ -44,10 +45,6 @@ public interface ITinyViewModel : INotifyPropertyChanged /// Task OnApplicationSleep(); - /// - /// Parameter that passed to this ViewModel when navigating back to it. - /// - object? ReturningParameter { get; set; } /// /// Parameter that passed to this ViewModel when navigated, will not be available in the constructor, use it when Initialize is running or later. diff --git a/src/MAUI/TinyMvvm.Maui/TinyView.cs b/src/MAUI/TinyMvvm.Maui/TinyView.cs index 8a03458..60a43c4 100644 --- a/src/MAUI/TinyMvvm.Maui/TinyView.cs +++ b/src/MAUI/TinyMvvm.Maui/TinyView.cs @@ -2,7 +2,7 @@ public abstract class TinyView : ContentPage { - internal SemaphoreSlim ReadLock { get; private set; } = new SemaphoreSlim(1, 1); + internal SemaphoreSlim InternalLock { get; private set; } = new SemaphoreSlim(1, 1); protected override void OnBindingContextChanged() { @@ -16,7 +16,7 @@ protected override void OnBindingContextChanged() { MainThread.BeginInvokeOnMainThread(async () => { - await ReadLock.WaitAsync(); + await InternalLock.WaitAsync(); await viewModel.Initialize(); viewModel.IsInitialized = true; @@ -25,7 +25,7 @@ protected override void OnBindingContextChanged() } finally { - ReadLock.Release(); + InternalLock.Release(); } } } @@ -38,7 +38,7 @@ protected override void OnAppearing() { MainThread.BeginInvokeOnMainThread(async () => { - await ReadLock.WaitAsync(); + await InternalLock.WaitAsync(); if (!viewModel.IsInitialized) { @@ -48,7 +48,7 @@ protected override void OnAppearing() await viewModel.OnAppearing(); - ReadLock.Release(); + InternalLock.Release(); }); } @@ -62,11 +62,11 @@ protected override void OnDisappearing() { MainThread.BeginInvokeOnMainThread(async () => { - await ReadLock.WaitAsync(); + await InternalLock.WaitAsync(); await viewModel.OnDisappearing(); - ReadLock.Release(); + InternalLock.Release(); }); } } diff --git a/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs b/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs index 77f3ccb..04d98d9 100644 --- a/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs +++ b/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs @@ -32,8 +32,9 @@ public TinyViewModel() /// public virtual Task Initialize() => Task.CompletedTask; + /// - public virtual Task Returning() => Task.CompletedTask; + public virtual Task ParameterSet() => Task.CompletedTask; /// public virtual Task OnAppearing() @@ -42,12 +43,8 @@ public virtual Task OnAppearing() if (!hasAppeared) { - MainThread.BeginInvokeOnMainThread(async () => await OnFirstAppear()); - - } - else - { - MainThread.BeginInvokeOnMainThread(async () => await Returning()); + MainThread.BeginInvokeOnMainThread(async () => await OnFirstAppear()); + } hasAppeared = true; @@ -67,9 +64,6 @@ public virtual Task OnAppearing() /// public virtual Task OnApplicationSleep() => Task.CompletedTask; - /// - public object? ReturningParameter { get; set; } - /// public object? NavigationParameter { get; set; } @@ -104,10 +98,10 @@ public bool IsBusy { var updated = Set(ref _isBusy, value); - if(updated) + if (updated) { RaisePropertyChanged(nameof(IsNotBusy)); - } + } } } @@ -120,7 +114,7 @@ public bool IsNotBusy } } - + private bool _isInitialized; /// public bool IsInitialized @@ -177,9 +171,14 @@ protected bool Set(ref T field, T newValue, [CallerMemberName] string? proper } /// - public void ApplyQueryAttributes(IDictionary query) + public async void ApplyQueryAttributes(IDictionary query) { - if(query.ContainsKey("tinyParameter")) + if(query == null || query.Count == 0) + { + return; + } + + if (query.ContainsKey("tinyParameter")) { NavigationParameter = query["tinyParameter"]; } @@ -187,5 +186,22 @@ public void ApplyQueryAttributes(IDictionary query) { QueryParameters = query; } + + async Task RunParameterSet() + { + await ParameterSet(); + } + + if (MainThread.IsMainThread) + { + await RunParameterSet(); + } + else + { + MainThread.BeginInvokeOnMainThread(async () => + { + await RunParameterSet(); + }); + } } } \ No newline at end of file diff --git a/src/MAUI/TinyMvvm.Sample/Services/CityService.cs b/src/MAUI/TinyMvvm.Sample/Services/CityService.cs index 3a840fd..4565c27 100644 --- a/src/MAUI/TinyMvvm.Sample/Services/CityService.cs +++ b/src/MAUI/TinyMvvm.Sample/Services/CityService.cs @@ -48,7 +48,7 @@ private async Task> Load() using var stream = await FileSystem.OpenAppPackageFileAsync("cities.json"); using var reader = new StreamReader(stream); - var contents = reader.ReadToEnd(); + var contents = await reader.ReadToEndAsync(); cities = JsonSerializer.Deserialize>(contents, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); diff --git a/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs b/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs index 651c902..21a1fc9 100644 --- a/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs +++ b/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs @@ -10,7 +10,7 @@ public DetailsViewModel(ICityService cityService) this.cityService = cityService; } - public override async Task Initialize() + public override async Task ParameterSet() { IsBusy = true; diff --git a/src/MAUI/TinyMvvm.Sample/ViewModels/MainViewModel.cs b/src/MAUI/TinyMvvm.Sample/ViewModels/MainViewModel.cs index 0f5f144..b654283 100644 --- a/src/MAUI/TinyMvvm.Sample/ViewModels/MainViewModel.cs +++ b/src/MAUI/TinyMvvm.Sample/ViewModels/MainViewModel.cs @@ -27,6 +27,8 @@ public string Text { IsBusy = true; + var isMain = MainThread.IsMainThread; + var result = await cityService.Search(Text); Cities = new ObservableCollection(result); diff --git a/src/MAUI/TinyMvvm.Sample/Views/DetailsView.xaml b/src/MAUI/TinyMvvm.Sample/Views/DetailsView.xaml index c6363a3..4ee93fe 100644 --- a/src/MAUI/TinyMvvm.Sample/Views/DetailsView.xaml +++ b/src/MAUI/TinyMvvm.Sample/Views/DetailsView.xaml @@ -4,9 +4,9 @@ xmlns:mvvm="clr-namespace:TinyMvvm;assembly=TinyMvvm.Maui" x:Class="TinyMvvm.Sample.Views.DetailsView" Title="DetailsView"> - + diff --git a/src/MAUI/TinyMvvm.Sample/Views/ListView.xaml b/src/MAUI/TinyMvvm.Sample/Views/ListView.xaml index 9c44672..a93897e 100644 --- a/src/MAUI/TinyMvvm.Sample/Views/ListView.xaml +++ b/src/MAUI/TinyMvvm.Sample/Views/ListView.xaml @@ -4,7 +4,7 @@ xmlns:mvvm="clr-namespace:TinyMvvm;assembly=TinyMvvm.Maui" x:Class="TinyMvvm.Sample.Views.ListView" Title="ListView"> - + diff --git a/src/MAUI/TinyMvvm.Sample/Views/MainView.xaml b/src/MAUI/TinyMvvm.Sample/Views/MainView.xaml index b554538..0d5c159 100644 --- a/src/MAUI/TinyMvvm.Sample/Views/MainView.xaml +++ b/src/MAUI/TinyMvvm.Sample/Views/MainView.xaml @@ -9,7 +9,7 @@