Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Can you provide an example of using ShowViewModel with parameters


Can you provide an example of using ShowViewModel with parameters


Using `ShowViewModel` with parameters is a common practice in MvvmCross for navigating between view models while passing data. Here's a detailed example of how to achieve this:

Step 1: Define a Parameter Model

First, you need to define a model that will hold the parameters you want to pass. This model should be simple and contain only public properties with both `get` and `set` access. The types of these properties can be `bool`, integral types, floating-point types, `char`, `string`, `DateTime`, or `Guid`.

csharp
public class DetailParameters
{
    public int Index { get; set; }
    public string Name { get; set; }
}

Step 2: Create the Destination ViewModel

Your destination view model should inherit from `MvxViewModel` where `TParameter` is the type of the parameter model you defined.

Super Savings on Servers!

Ad

csharp
public class DetailViewModel : MvxViewModel
{
    private readonly IMyService _myService;

    public DetailViewModel(IMyService myService)
    {
        _myService = myService;
    }

    public override void Prepare(DetailParameters parameter)
    {
        // Save the parameters here. Do not perform any logic here.
        Index = parameter.Index;
        Name = parameter.Name;
    }

    private int Index { get; set; }
    private string Name { get; set; }

    // Other properties and methods...
}

Step 3: Navigate Using ShowViewModel

To navigate to the `DetailViewModel` with parameters, use the `ShowViewModel` method provided by MvvmCross's navigation service. You can pass an instance of your parameter model.

csharp
public class MasterViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

    public MasterViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public async Task NavigateToDetailAsync()
    {
        var parameters = new DetailParameters { Index = 2, Name = "John Doe" };
        await _navigationService.Navigate(parameters);
    }
}

Alternative: Using Anonymous Parameters

For simpler cases, you can use anonymous objects instead of defining a specific parameter class.

csharp
public class MasterViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

    public MasterViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public async Task NavigateToDetailAsync()
    {
        await _navigationService.Navigate(new { index = 2, name = "John Doe" });
    }
}

In this case, your `DetailViewModel` should use the `Prepare` method without a specific type, or define an `Init` method to receive the parameters.

csharp
public class DetailViewModel : MvxViewModel
{
    public void Init(int index, string name)
    {
        // Use the parameters here
    }
}

However, using anonymous objects is limited by serialization requirements and is generally less flexible than using a defined parameter class.

Conclusion

Using `ShowViewModel` with parameters is a powerful way to pass data between view models in MvvmCross applications. By defining a parameter model and using the `Prepare` method, you can efficiently navigate and initialize view models with the required data.

Citations:
[1] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[2] https://stackoverflow.com/questions/36917621/mvvm-viewmodel-to-model-communication-and-parameters
[3] https://learn.microsoft.com/en-us/dotnet/maui/xaml/fundamentals/mvvm?view=net-maui-9.0
[4] https://www.mvvmcross.com/documentation/fundamentals/navigation
[5] https://www.youtube.com/watch?v=9sqvBydNJSg
[6] https://stackoverflow.com/questions/28025630/xamarin-mvvmcross-how-to-show-viewmodel-with-updated-parameters-in-navigation
[7] https://github.com/MvvmCross/MvvmCross/issues/2228
[8] https://developer.android.com/topic/libraries/architecture/viewmodel