Skip to content

Commit

Permalink
navigate with parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
dhindrik committed Jun 27, 2022
1 parent d5da5ac commit 941399c
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 34 deletions.
9 changes: 3 additions & 6 deletions src/MAUI/TinyMvvm.Maui/ITinyViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ public interface ITinyViewModel : INotifyPropertyChanged
Task Initialize();

/// <summary>
/// This method will run after navigating back.
/// This method runs when navigation parameters are set.
/// </summary>
Task Returning();
/// <returns></returns>
Task ParameterSet();

/// <summary>
/// This method will run every time the view is apperaing.
Expand All @@ -44,10 +45,6 @@ public interface ITinyViewModel : INotifyPropertyChanged
/// </summary>
Task OnApplicationSleep();

/// <summary>
/// Parameter that passed to this ViewModel when navigating back to it.
/// </summary>
object? ReturningParameter { get; set; }

/// <summary>
/// Parameter that passed to this ViewModel when navigated, will not be available in the constructor, use it when Initialize is running or later.
Expand Down
14 changes: 7 additions & 7 deletions src/MAUI/TinyMvvm.Maui/TinyView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand All @@ -16,7 +16,7 @@ protected override void OnBindingContextChanged()
{
MainThread.BeginInvokeOnMainThread(async () =>
{
await ReadLock.WaitAsync();
await InternalLock.WaitAsync();
await viewModel.Initialize();

viewModel.IsInitialized = true;
Expand All @@ -25,7 +25,7 @@ protected override void OnBindingContextChanged()
}
finally
{
ReadLock.Release();
InternalLock.Release();
}
}
}
Expand All @@ -38,7 +38,7 @@ protected override void OnAppearing()
{
MainThread.BeginInvokeOnMainThread(async () =>
{
await ReadLock.WaitAsync();
await InternalLock.WaitAsync();

if (!viewModel.IsInitialized)
{
Expand All @@ -48,7 +48,7 @@ protected override void OnAppearing()

await viewModel.OnAppearing();

ReadLock.Release();
InternalLock.Release();
});

}
Expand All @@ -62,11 +62,11 @@ protected override void OnDisappearing()
{
MainThread.BeginInvokeOnMainThread(async () =>
{
await ReadLock.WaitAsync();
await InternalLock.WaitAsync();

await viewModel.OnDisappearing();

ReadLock.Release();
InternalLock.Release();
});
}
}
Expand Down
46 changes: 31 additions & 15 deletions src/MAUI/TinyMvvm.Maui/TinyViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ public TinyViewModel()
/// <inheritdoc />
public virtual Task Initialize() => Task.CompletedTask;


/// <inheritdoc />
public virtual Task Returning() => Task.CompletedTask;
public virtual Task ParameterSet() => Task.CompletedTask;

/// <inheritdoc />
public virtual Task OnAppearing()
Expand All @@ -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;
Expand All @@ -67,9 +64,6 @@ public virtual Task OnAppearing()
/// <inheritdoc />
public virtual Task OnApplicationSleep() => Task.CompletedTask;

/// <inheritdoc />
public object? ReturningParameter { get; set; }

/// <inheritdoc />
public object? NavigationParameter { get; set; }

Expand Down Expand Up @@ -104,10 +98,10 @@ public bool IsBusy
{
var updated = Set(ref _isBusy, value);

if(updated)
if (updated)
{
RaisePropertyChanged(nameof(IsNotBusy));
}
}
}
}

Expand All @@ -120,7 +114,7 @@ public bool IsNotBusy
}
}


private bool _isInitialized;
/// <inheritdoc />
public bool IsInitialized
Expand Down Expand Up @@ -177,15 +171,37 @@ protected bool Set<T>(ref T field, T newValue, [CallerMemberName] string? proper
}

/// <inheritdoc />
public void ApplyQueryAttributes(IDictionary<string, object> query)
public async void ApplyQueryAttributes(IDictionary<string, object> query)
{
if(query.ContainsKey("tinyParameter"))
if(query == null || query.Count == 0)
{
return;
}

if (query.ContainsKey("tinyParameter"))
{
NavigationParameter = query["tinyParameter"];
}
else
{
QueryParameters = query;
}

async Task RunParameterSet()
{
await ParameterSet();
}

if (MainThread.IsMainThread)
{
await RunParameterSet();
}
else
{
MainThread.BeginInvokeOnMainThread(async () =>
{
await RunParameterSet();
});
}
}
}
2 changes: 1 addition & 1 deletion src/MAUI/TinyMvvm.Sample/Services/CityService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private async Task<List<City>> 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<List<City>>(contents, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });

Expand Down
2 changes: 1 addition & 1 deletion src/MAUI/TinyMvvm.Sample/ViewModels/DetailsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public DetailsViewModel(ICityService cityService)
this.cityService = cityService;
}

public override async Task Initialize()
public override async Task ParameterSet()
{
IsBusy = true;

Expand Down
2 changes: 2 additions & 0 deletions src/MAUI/TinyMvvm.Sample/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public string Text
{
IsBusy = true;

var isMain = MainThread.IsMainThread;

var result = await cityService.Search(Text);

Cities = new ObservableCollection<City>(result);
Expand Down
4 changes: 2 additions & 2 deletions src/MAUI/TinyMvvm.Sample/Views/DetailsView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
xmlns:mvvm="clr-namespace:TinyMvvm;assembly=TinyMvvm.Maui"
x:Class="TinyMvvm.Sample.Views.DetailsView"
Title="DetailsView">
<VerticalStackLayout>
<VerticalStackLayout Padding="10">
<Label
Text="Welcome to .NET MAUI!"
Text="{Binding City.Name}"
VerticalOptions="Center"
HorizontalOptions="Center" />
</VerticalStackLayout>
Expand Down
2 changes: 1 addition & 1 deletion src/MAUI/TinyMvvm.Sample/Views/ListView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
xmlns:mvvm="clr-namespace:TinyMvvm;assembly=TinyMvvm.Maui"
x:Class="TinyMvvm.Sample.Views.ListView"
Title="ListView">
<Grid>
<Grid Padding="10">
<ActivityIndicator HorizontalOptions="Center" VerticalOptions="Center" IsRunning="{Binding IsBusy}" />
<CollectionView x:Name="CityList" ItemsSource="{Binding Cities}" IsVisible="{Binding IsNotBusy}">
<CollectionView.ItemTemplate>
Expand Down
2 changes: 1 addition & 1 deletion src/MAUI/TinyMvvm.Sample/Views/MainView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<Entry Text="{Binding Text}" Placeholder="Search city" />
<Button Command="{Binding Search}" Text="Search" />
</VerticalStackLayout>
<ActivityIndicator Grid.Row="1" HorizontalOptions="Center" VerticalOptions="Center" IsRunning="{Binding IsBusy}" />
<ActivityIndicator Grid.Row="1" HorizontalOptions="Center" VerticalOptions="Center" IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}" />
<CollectionView Grid.Row="1" x:Name="CityList" ItemsSource="{Binding Cities}" IsVisible="{Binding IsNotBusy}">
<CollectionView.ItemTemplate>
<DataTemplate>
Expand Down

0 comments on commit 941399c

Please sign in to comment.