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 @@
-
+