Signcodeindie
Signcodeindie

Reputation: 796

How to share ShowViewModel class in ViewModel

I am developing a Xamarin mobile app using MVVM Cross. There are two ViewModels which are doing same thing i.e. showing a dialog using the code below:

var register = await UserDialogHelper.RaiseNotRegisteredAsync (UserDialogs);
        if (register) {
            ShowViewModel<WebViewModel> (new
                {
                    url = Urls.RegisterPage,
                    title = "Register",
                });
        }

I tried moving this code to static class but unable to resolve ShowViewModel. Can anyone suggest how to resolve ShowViewModel in non-viewmodel class?

Upvotes: 1

Views: 482

Answers (2)

SergioZgz
SergioZgz

Reputation: 148

ShowViewModel comes from MvxNavigatingObject if your class doesn't inherited it you cannot use it.

You could something like this in a class than is not a MvxViewModel:

var viewDispatcher = Mvx.Resolve<IMvxViewDispatcher>();
viewDispatcher.ShowViewModel(new MvxViewModelRequest(
                                                vmtype,
                                                parameterBundle,
                                                presentationBundle,
                                                requestedBy));

But I think that answer from Joehl is the correcty way :)

Upvotes: 0

Joehl
Joehl

Reputation: 3701

When you have methods or properties to share between the same viewmoels. You can just implement a base viewmodel. And the other ones just inherit from this base viewmodel. Like following example:

public abstract class MyBaseViewModel : MvxViewModel
{
    public void MyMethod()
    {
        // Your code
        var register = await UserDialogHelper.RaiseNotRegisteredAsync (UserDialogs);
        if (register) {
            ShowViewModel<WebViewModel> (new
            {
                url = Urls.RegisterPage,
                title = "Register",
            });
        }
    }
}

And then your viewmodels look like this:

public class MyFirstViewModel : MyBaseViewModel
{

}

Inside this MyFirstViewModel you can call the base method MyMethod. And so on...

Edit

If you want to navigate from outside a view/viewmodel: Look at this answer from Stuart or the answer here from @SergioZgz

Upvotes: 3

Related Questions