Exatex
Exatex

Reputation: 359

MVVMcross Command Binding fire Exception

I experience an issue when i try to use a command to open a Second View Model V4.0.Beta5. I followed the Exemple described in N+1 Video series https://www.youtube.com/playlist?list=PLR6WI6W1JdeYSXLbm58jwAKYT7RQR31-W

First ViewModel

public class FirstViewModel
    : MvxViewModel
{
    private string _hello = "Hello MvvmCross";

    public string Hello
    {
        get { return _hello; }
        set
        {
            _hello = value;
            RaisePropertyChanged(() => Hello);
        }
    }

    private Cirrious.MvvmCross.ViewModels.MvxCommand _goSecondViewCommand;

    public System.Windows.Input.ICommand GoSecondViewCommand
    {
        get
        {
            _goSecondViewCommand = _goSecondViewCommand ??
                                   new Cirrious.MvvmCross.ViewModels.MvxCommand(DoGoSecondView);
            return _goSecondViewCommand;
        }
    }

    private void DoGoSecondView()
    {
        base.ShowViewModel<SecondViewModel>();
    }
}

Second View model

public class SecondViewModel :MvxViewModel
{
    private string _hello2 = "Hello2 MvvmCross";

    public string Hello2
    {
        get { return _hello2; }
        set
        {
            _hello2 = value;
            RaisePropertyChanged(() => Hello2);
        }
    }
}

First View

<views:MvxWindowsPage
x:Class="TestCommand.UWP.Views.FirstView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestCommand.UWP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="using:Cirrious.MvvmCross.WindowsUWP.Views"
mc:Ignorable="d">

<Grid>
    <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="70,92,0,0" TextWrapping="Wrap" Text="FirstView" VerticalAlignment="Top" Width="223"/>
    <Button x:Name="button" Command="{Binding GoSecondViewCommand}" Content="Button" HorizontalAlignment="Left" Height="108" Margin="70,346,0,0" VerticalAlignment="Top" Width="223"/>
</Grid>

Second view

<views:MvxWindowsPage
x:Class="TestCommand.UWP.Views.SecondView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestCommand.UWP.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="using:Cirrious.MvvmCross.WindowsUWP.Views"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid />

Setup Class:

    public class Setup : MvxWindowsSetup
{
    public Setup(Frame rootFrame) : base(rootFrame)
    {
    }

    protected override IMvxApplication CreateApp()
    {
        return new TestCommand.Core.App();
    }
}

If you want you can download the solution Here: https://onedrive.live.com/redir?resid=A5D9789788DE33CB!36079&authkey=!AKs9nsG28iI6nQQ&ithint=file%2czip.

Upvotes: 0

Views: 605

Answers (1)

Franklin Chen - MSFT
Franklin Chen - MSFT

Reputation: 4923

The possible reason is you don't use Setup correctly in your UWP app, here is what I do to make this work:

1) Create two ViewModels in the UWP app: FirstViewModel and SecondViewModel

2) Create a Setup class in Setup.cs file:

public class Setup : MvxWindowsSetup
{
        public Setup(Frame rootFrame) : base(rootFrame)
        {
        }

        protected override IMvxApplication CreateApp()
        {
            return new AppSetup();
        }
}

public class AppSetup : MvxApplication
{
        public override void Initialize()
        {
            RegisterAppStart<FirstViewModel>();
        }
}

3) FirstView.xaml:

<StackPanel>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="70,92,0,0" TextWrapping="Wrap" Text="FirstView" VerticalAlignment="Top" Width="223"/>
        <TextBlock Height="50" Text="{Binding Hello}" />
        <Button x:Name="button" Command="{Binding GoSecondViewCommand}" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="223" Height="50" />
    </StackPanel>

4) SecondView.xaml:

<StackPanel>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="70,92,0,0" TextWrapping="Wrap" Text="SecondView" VerticalAlignment="Top" Width="223"/>
        <TextBlock Height="50" Text="{Binding Hello2}" />
    </StackPanel>

5) In App.xaml.cs file, make the following changes in OnLaunched method:

protected override void OnLaunched(LaunchActivatedEventArgs e)
{

......

            if (rootFrame.Content == null)
            {
                var setup = new Setup(rootFrame);
                setup.Initialize();

                var start = Mvx.Resolve<IMvxAppStart>();
                start.Start();
            }
            // Ensure the current window is active
            Window.Current.Activate();
}

By the way, the MvvmCross version is 3.5.1

Check the Completed sample on Github


Update for exception in OnNavigationFailed method:

Please comment this line in FirstView and SecondView's code behind:

ViewModel = new FirstViewModel();

ViewModel = new SecondViewModel();

The MvvmCross has set the ViewModel automatically.

Upvotes: 1

Related Questions