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