Wpf 如何使用Unity 4和MvvmLight在Visual Studio中启用设计时数据

Wpf 如何使用Unity 4和MvvmLight在Visual Studio中启用设计时数据,wpf,visual-studio,xaml,unity-container,mvvm-light,Wpf,Visual Studio,Xaml,Unity Container,Mvvm Light,我正试图了解WPF、Unity和MvvMlight(galasoft)。到目前为止,我的小装置工作正常。如果我运行我的应用程序,标签将填充由我的数据服务生成的随机名称。(小胜利,让所有运动部件工作) 但是在VisualStudio的设计视图中,标签仍然是空的。如何说服VisualStudio在标签中呈现一些“设计时”数据 我使用的是:Visual Studio Premium 2013、Unity 4.0.1、MvvmLight 5.2、.net 4.5 App.xaml.cs public p

我正试图了解WPF、Unity和MvvMlight(galasoft)。到目前为止,我的小装置工作正常。如果我运行我的应用程序,标签将填充由我的数据服务生成的随机名称。(小胜利,让所有运动部件工作)

但是在VisualStudio的设计视图中,标签仍然是空的。如何说服VisualStudio在标签中呈现一些“设计时”数据

我使用的是:Visual Studio Premium 2013、Unity 4.0.1、MvvmLight 5.2、.net 4.5

App.xaml.cs

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IDataService, DataService>();
        container.RegisterType<IMainViewModel, MainViewModel>();

        MainWindow mainWindow = container.Resolve<MainWindow>();
        mainWindow.Show(); 

        base.OnStartup(e);
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(IMainViewModel theViewModel)
        : this()
    {
        this.DataContext = theViewModel;
    }
}
public class MainViewModel : ViewModelBase, IMainViewModel
{
    private readonly IDataService _dataService;

    public MainViewModel(IDataService dataService)
    {
        _dataService = dataService;

        if (IsInDesignMode)
        {
            // Code runs in design time data.
            MyText = "Design Data";
        }
        else
        {
            // Code runs "for real"
            MyText = _dataService.GetName();
        }

    }

    public string MyText { get; set; }
}
public partial class MainWindow : Window
{
    // Contructor used in DesignTime
    public MainWindow()
    {
        InitializeComponent();
    }

    //Constructor used by Unity
    public MainWindow(IMainViewModel theViewModel)
        : this()
    {
        this.DataContext = theViewModel;
    }
}
MainViewModel.cs

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IDataService, DataService>();
        container.RegisterType<IMainViewModel, MainViewModel>();

        MainWindow mainWindow = container.Resolve<MainWindow>();
        mainWindow.Show(); 

        base.OnStartup(e);
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(IMainViewModel theViewModel)
        : this()
    {
        this.DataContext = theViewModel;
    }
}
public class MainViewModel : ViewModelBase, IMainViewModel
{
    private readonly IDataService _dataService;

    public MainViewModel(IDataService dataService)
    {
        _dataService = dataService;

        if (IsInDesignMode)
        {
            // Code runs in design time data.
            MyText = "Design Data";
        }
        else
        {
            // Code runs "for real"
            MyText = _dataService.GetName();
        }

    }

    public string MyText { get; set; }
}
public partial class MainWindow : Window
{
    // Contructor used in DesignTime
    public MainWindow()
    {
        InitializeComponent();
    }

    //Constructor used by Unity
    public MainWindow(IMainViewModel theViewModel)
        : this()
    {
        this.DataContext = theViewModel;
    }
}

我找到了一个方法,使用来自

我在一个单独的名称空间中创建了
IMainVieModel
的第二个(平面)实现:
UnityMvvmTest.ViewModel.Design
。此实现没有逻辑,它只是填充属性,以便设计器可以显示一些数据

此实现在设计时使用,因为它被指定为设计时数据上下文。(使用
xmlns:d
xmlns:mc
xmlns:vm
)。运行时,需要使用
mc
-命名空间来隐藏
d
-命名空间

结果是Xaml中增加了5行,这是
IMainViewModel
的一个额外(几乎为空)实现。代码隐藏中还有一个额外的(空)构造函数,而不是测试
IsInDesignMode
的构造函数。这没什么大不了的,因为unity将选择具有最多可解析参数的构造函数

main window.xaml

<Window x:Class="UnityMvvmTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="500">
    <Grid>
        <Label x:Name="myLabel" Content="{Binding MyText}"/>
    </Grid>
</Window>
<Window x:Class="UnityMvvmTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:UnityMvvmTest.ViewModel.Design"
    d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:MainViewModel}"
    mc:Ignorable="d"
    >
    <Grid>
        <Label x:Name="myLabel" Content="{Binding MyText}" />
    </Grid>
</Window>
MainViewModel.cs(设计时实现)