如何使用 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:d
、xmlns:mc
和 xmlns: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; }
}
}
我正在努力了解 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:d
、xmlns:mc
和 xmlns: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; }
}
}