diff --git a/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs b/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs index b140fc9..8118f4e 100644 --- a/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs +++ b/src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs @@ -18,7 +18,7 @@ public interface ITinyViewModel /// This method runs when navigation parameters are set. /// /// - Task ParameterSet(); + Task OnParameterSet(); /// /// This method will run every time the view is apperaing. diff --git a/src/MAUI/TinyMvvm.Maui/TinyView.cs b/src/MAUI/TinyMvvm.Maui/TinyView.cs index 60a43c4..18da4db 100644 --- a/src/MAUI/TinyMvvm.Maui/TinyView.cs +++ b/src/MAUI/TinyMvvm.Maui/TinyView.cs @@ -4,29 +4,40 @@ public abstract class TinyView : ContentPage { internal SemaphoreSlim InternalLock { get; private set; } = new SemaphoreSlim(1, 1); - protected override void OnBindingContextChanged() + protected override async void OnBindingContextChanged() { base.OnBindingContextChanged(); if (BindingContext is ITinyViewModel viewModel) { - try + if (!viewModel.IsInitialized) { - if (!viewModel.IsInitialized) + + async Task InternalInitialize() { - MainThread.BeginInvokeOnMainThread(async () => + try { await InternalLock.WaitAsync(); await viewModel.Initialize(); viewModel.IsInitialized = true; - }); + } + finally + { + InternalLock.Release(); + } + } + + if (MainThread.IsMainThread) + { + await InternalInitialize(); + } + else + { + MainThread.BeginInvokeOnMainThread(async () => await InternalInitialize()); } } - finally - { - InternalLock.Release(); - } + } } diff --git a/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs b/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs index 34a49bb..cc50cd0 100644 --- a/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs +++ b/src/MAUI/TinyMvvm.Maui/TinyViewModel.cs @@ -34,7 +34,7 @@ public TinyViewModel() /// - public virtual Task ParameterSet() => Task.CompletedTask; + public virtual Task OnParameterSet() => Task.CompletedTask; /// public virtual Task OnAppearing() @@ -90,7 +90,7 @@ public INavigation Navigation [ObservableProperty] [NotifyPropertyChangedFor(nameof(IsNotBusy))] private bool _isBusy; - + /// public bool IsNotBusy @@ -104,7 +104,7 @@ public bool IsNotBusy [ObservableProperty] [NotifyPropertyChangedFor(nameof(IsNotInitialized))] private bool _isInitialized; - + /// public bool IsNotInitialized @@ -121,7 +121,7 @@ public bool IsNotInitialized /// public async void ApplyQueryAttributes(IDictionary query) { - if(query == null || query.Count == 0) + if (query == null || query.Count == 0) { return; } @@ -152,20 +152,15 @@ public async void ApplyQueryAttributes(IDictionary query) QueryParameters = query; } - async Task RunParameterSet() - { - await ParameterSet(); - } - if (MainThread.IsMainThread) { - await RunParameterSet(); + await OnParameterSet(); } else { MainThread.BeginInvokeOnMainThread(async () => { - await RunParameterSet(); + await OnParameterSet(); }); } } diff --git a/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs b/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs index 0810030..4e59c23 100644 --- a/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs +++ b/src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs @@ -13,7 +13,7 @@ public DetailsViewModel(ICityService cityService) this.cityService = cityService; } - public override async Task ParameterSet() + public override async Task OnParameterSet() { IsBusy = true; diff --git a/src/MAUI/TinyMvvm.Sample/ViewModels/ListViewModel.cs b/src/MAUI/TinyMvvm.Sample/ViewModels/ListViewModel.cs index 897594f..55dc6c4 100644 --- a/src/MAUI/TinyMvvm.Sample/ViewModels/ListViewModel.cs +++ b/src/MAUI/TinyMvvm.Sample/ViewModels/ListViewModel.cs @@ -21,7 +21,7 @@ public override async Task Initialize() IsBusy = true; var result = await cityService.GetAll(); - Cities = new ObservableCollection(result); + Cities = new ObservableCollection(result.Take(100)); IsBusy = false; }