具有Init()方法的MvvmCross ViewModel类在设计时崩溃

时间:2015-09-11 08:05:22

标签: mvvmcross

我尝试将设计时数据实现到我的代码中(参见下面的DataContext)。 问题是,我在Visual Studio中有一个异常“对象引用没有设置为对象的实例”,在设计视图中打开了MainView.xaml。我尝试用另一个VS实例调试它但没有断点。 我把它缩小了。只要ViewModel上有一个Init()方法,就会失败。这个Init()由MvvmCross框架调用。 如果我删除了Init()方法,它在Designer中运行得很好。因此,我怀疑MvvmCross缺少“IsInDesignMode”检查,但由于我是MvvmCross的新手,可能很可能是我的错。

完整示例在这里: https://github.com/indazoo/MvvmCross_DesignData 此示例抛出异常。您可以在MainViewModel.cs中删除Init()方法,代码在Designer中运行正常。

要调试设计器,我禁用了“只是我的代码”,并在附加的VS实例中启用了所有CLR异常但没有断点。欢迎任何提示。

这里有一些代码摘录(更多内容见github上的示例代码):

该页面源自LayoutAwarePage(MvvmCross TipCalc Sample)。

<localViews:LayoutAwarePage
x:Class="App2.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2"
xmlns:localViews="using:App2.Views"
xmlns:cirrViews="using:Cirrious.MvvmCross.WindowsCommon.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{Binding Source={StaticResource DesignFactory}, Converter={StaticResource DesignConverter}, ConverterParameter=MainViewModel}"
>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBlock Text="1234"></TextBlock>
        <TextBlock Text="123123"></TextBlock>
        <TextBlock Text="{Binding DesignTimeHello, Mode=OneWay, FallbackValue=DesgnRuntimeFallback}" FontSize="30" />
        <TextBlock Text="123123"></TextBlock>
        <TextBox Text="{Binding MyProperty, Mode=TwoWay, FallbackValue=FallBackTextBox}" />
    </StackPanel>
</Grid>

XAML背后的代码:

    public sealed partial class MainView : LayoutAwarePage
{
    public MainView()
    {
        this.InitializeComponent();
    }

    public new MainViewModel ViewModel
    {
        get { return (MainViewModel)base.ViewModel; }
        set { base.ViewModel = value; }
    }
}

MainViewModel:

    public class MainViewModel : MvxViewModel
{
    private IDataService Data { get; set; }

    public MainViewModel(IDataService data) 
    {
        Data = data; 
    }

    public string DesignTimeHello
    {
        get { return Data != null ? Data.TestData : "Missing"; }
    }


    //!!! If you comment this method everything works !!!
    public void Init()
    {
        int i = 0;
        i++;
     }
     .....

的App.xaml

<Application
x:Class="App2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CoreHelpers="using:App2.Helpers"
xmlns:local="using:App2">
<Application.Resources>
    <ResourceDictionary >
        <CoreHelpers:DesignTimeHelper x:Key="DesignTime" />
        <local:DesignFactory x:Key="DesignFactory"/>
        <local:DesignTimeConverter x:Key="DesignConverter" />
    </ResourceDictionary>
</Application.Resources>

0 个答案:

没有答案