我尝试将设计时数据实现到我的代码中(参见下面的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>