如何使用 Unity 4 和 MvvmLight 在 Visual Studio 中启用 DesignTime 数据

How to enable DesignTime data in Visual Studio with Unity 4 and MvvmLight

我正在努力了解 WPF、Unity 和 MvvMlight (galasoft)。到目前为止,我的小设置有效。如果我 运行 我的应用程序标签填充了我的 DataService 生成的随机名称。 (小胜利让所有运动部件工作)

但在 Visual Studio 的设计视图中,标签仍然是空的。我如何说服 VisualStudio 在我的标签中呈现一些 'design time' 数据?

我正在使用:Visual StudioPremium 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);
    }
}

App.xaml中我没有定义StartUpUri

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

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(IMainViewModel theViewModel)
        : this()
    {
        this.DataContext = theViewModel;
    }
}

MainViewModel.cs

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

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

的提示

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

此实现在设计时使用,因为它被指定为 DesignTime DataContext。 (使用 xmlns:dxmlns:mcxmlns:vm)。 mc-命名空间需要在运行时隐藏d-命名空间,see why.

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

MainWindow.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="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>

MainWindow.xaml.cs

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(设计时实现)

namespace UnityMvvmTest.ViewModel.Design
{
    public class MainViewModel : IMainViewModel
    {

        public MainViewModel()
        {
            MyText = "my Design time data";
        } 

        public string MyText { get; set; }
    }
}