MVVMcross命令绑定火灾异常

时间:2015-11-10 20:51:28

标签: mvvmcross uwp

当我尝试使用命令打开第二个视图模型 V4.0.Beta5 时遇到问题。 我按照N + 1视频系列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>();
    }
}

第二视图模型

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

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

第一视图

<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>

第二种观点

<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 />

设置类:

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

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

如果您需要,可以下载解决方案: https://onedrive.live.com/redir?resid=A5D9789788DE33CB!36079&authkey=!AKs9nsG28iI6nQQ&ithint=file%2czip

1 个答案:

答案 0 :(得分:1)

可能的原因是您没有在UWP应用中正确使用安装程序,以下是我要做的工作:

1)在UWP应用中创建两个ViewModel:FirstViewModel和SecondViewModel

2)Setup.cs文件中创建安装程序类:

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)App.xaml.cs文件中,在OnLaunched方法中进行以下更改:

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();
}

顺便说一下,MvvmCross版本是3.5.1

检查Github

上的已完成示例

OnNavigationFailed方法中的例外更新:

请在FirstView和SecondView的代码中注释这一行:

ViewModel = new FirstViewModel();

ViewModel = new SecondViewModel();

MvvmCross已自动设置ViewModel。