【发布时间】:2016-08-06 11:34:28
【问题描述】:
我一直在尝试使用 Unity 在 wpf 应用程序中设置依赖注入,但似乎无法完全理解应如何设置视图和视图模型。
查看了另一个 SO 帖子 --> Wpf Unity 但似乎还不能完全理解。我以前使用过 Unity,但只是在 MVC 应用程序中,所以我知道如何将它注入到构造函数中。
这是我在应用程序中的视图和视图模型。
观看次数:
MainWindow.xaml
BookingView.xaml
ContactDetailsView.xaml
ReservationsView.xaml
视图模型:
MenuViewModel (MainWindow uses this viewModel)
BookingViewModel
ContactViewModel
ReservationsViewModel
我的 ViewModel 都实现了接口,比如 IMenuViewModel,视图应该也有接口吗?
我猜既然MainWindow是起点,应该是在这里注册容器吧?
更新:
找到了一些东西,但不确定我是否做得对。这是我到目前为止所做的!
1:在app.cs中使用启动方法
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewMainWindowViewModel, MainWindow>();
container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
var mainWindow = container.Resolve<MainWindow>(); // Creating Main window
mainWindow.Show();
}
}
2:从启动中删除 uri。
3:在MainWindow类中创建IViewMainWindowViewModel接口,接口为空。
public interface IViewMainWindowViewModel
{
}
4:在MainWindow中引用该接口
public partial class MainWindow : Window, IViewMainWindowViewModel
{
public MainWindow(IViewMainWindowViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
5:同样适用于 MenuViewModel
public class MenuViewModel : IViewMainWindowViewModel
{
Code not shown!
}
这甚至不会启动应用程序..
更新 2
我的 MainWindow 类如下所示:
public interface IViewMainWindowViewModel
{
}
public partial class MainWindow : Window, IViewMainWindowViewModel
{
public MainWindow(IViewMainWindowViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
App 类现在看起来像这样:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewMainWindowViewModel, MainWindow>();
container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
container.Resolve<MainWindow>().Show();
//Do the same actions for all views and their viewmodels
}
运行应用程序时,我在这一行遇到异常
container.Resolve<MainWindow>().Show();
更新 3
在我的 MenuViewModel 中,它有两个命令将打开两个视图,然后我是否需要在 MenuViewModel 的构造函数中注入这些视图,或者你可以在 MenuViewModel 和 BookingView 之间创建另一个空接口作为示例?
【问题讨论】:
标签: wpf mvvm dependency-injection