c#-依赖注入以在MVVM中以对话框形式启动视图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-依赖注入以在MVVM中以对话框形式启动视图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4726字,纯文字阅读大概需要7分钟。
内容图文
我需要一些建议,以了解如何在ViewModel中处理依赖项注入.我的viewModel MenuViewModel有一个ICommand方法,当用户单击视图中的按钮时,该方法将运行.此方法将打开一个新窗口.该方法如下所示.
public void bookingCommand_DoWork(object obj)
{
BookingView bookingView = new BookingView();
BookingViewModel model = new BookingViewModel();
bookingView.DataContext = model;
bookingView.ShowDialog();
}
它创建BookingView和BookingViewModel的实例.我正在尝试使用依赖注入而不是像这样创建实例.
MenuViewModel
public class MenuViewModel : IViewMainWindowViewModel
{
//commands
public ICommand bookingCommand { get; set; }
public MenuViewModel()
{
bookingCommand = new RelayCommand(bookingCommand_DoWork, () => true);
}
public void bookingCommand_DoWork(object obj)
{
BookingView bookingView = new BookingView();
BookingViewModel model = new BookingViewModel();
bookingView.DataContext = model;
bookingView.ShowDialog();
}
}
IViewMainWindowViewModel是一个空接口,它使我的MainWindow和MenuViewModel之间成为契约.
我正在使用的统一启动方法
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewMainWindowViewModel, MainWindow>();
container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
container.RegisterType<IViewBookingViewModel, BookingViewModel>();
container.RegisterType<IViewBookingViewModel, BookingView>();
container.Resolve<MainWindow>().Show();
//Do the same actions for all views and their viewmodels
}
好吧,我的MenuViewModel取决于BookingView& BookingViewModel.
我应该将其注入到构造函数中吗?
希望有人能给些建议.
更新(当前为我工作)
到目前为止,我所做的是:
1.应用程式类别
public partial class App : Application
{
public IUnityContainer _container;
public IUnityContainer UnityContainer
{
get
{
if (_container == null)
{
_container = new UnityContainer();
}
return _container;
}
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
_container = new UnityContainer();
_container.RegisterType<IViewMainWindowViewModel, MainWindow>();
_container.RegisterType<IViewMainWindowViewModel, MenuViewModel>();
_container.RegisterType<IViewBookingViewModel, BookingView>();
_container.RegisterType<IViewBookingViewModel, BookingViewModel>();
_container.RegisterType(typeof(IDialogService<>), typeof(DialogService<>));
_container.Resolve<MainWindow>().Show();
}
}
2.创建IDialogService并从App类导入容器.
public interface IDialogService<T>
{
void Show();
void ShowDialog();
}
public class DialogService<T> : IDialogService<T> where T : Window
{
public void Show()
{
var container = ((App)Application.Current).UnityContainer;
container.Resolve<T>().Show();
}
public void ShowDialog()
{
var container = ((App)Application.Current).UnityContainer;
container.Resolve<T>().ShowDialog();
}
}
现在,我在使用Show和ShowDialog方法时遇到了错误.
“ T”不包含“ Show” /“ ShowDialog”的定义,也没有扩展方法“ Show” /“ ShowDialog”接受类型T的第一个参数.
3.在MenuViewModel中注入服务
public class MenuViewModel : IViewMainWindowViewModel
{
//commands
public ICommand bookingCommand { get; set; }
//entities
private IDialogService<BookingView> _dialogService;
public MenuViewModel(IDialogService<BookingView> dialogService)
{
// Injecting
_dialogService = dialogService;
bookingCommand = new RelayCommand(bookingCommand_DoWork, () => true);
}
public void bookingCommand_DoWork(object obj)
{
_dialogService.ShowDialog();
}
}
解决方法:
在某些情况下,我们必须将视图启动为“模型”或“ ModeLess”对话框.为了将事情保持在MVVM的边界内,我宁愿创建一个单独的服务以将视图作为对话框启动,以便可以在整个应用程序中以通用方式使用它.并将通过构造器将该服务注入到ViewModel中,该构造器要启动任何对话框.
public interface IDialogService<T>
{
void Show();
void ShowDialog();
}
public class DialogService<T> : IDialogService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}
public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}
现在,我将此服务注入到相应的视图模型中.
public class MenuViewModel : IViewMainWindowViewModel
{
//commands
public ICommand bookingCommand { get; set; }
private IDialogService<BookingView> _dialogService;
public MenuViewModel(IDialogService<BookingView > dialogService)
{
_dialogService = dialogService
bookingCommand = new RelayCommand(bookingCommand_DoWork, () => true);
}
public void bookingCommand_DoWork(object obj)
{
//Since you want to launch this view as dialog you can set its datacontext in its own constructor.
_dialogService.ShowDialog();
}
}
在App.xaml.cs中,您可以定义以下属性.然后可以使用UnityContainer属性,然后在使用中可以像var container =((App)Application.Current).UnityContainer;这样获得容器.
public IUnityContainer _container;
public IUnityContainer UnityContainer
{
get
{
if (_container == null)
{
_container = new UnityContainer();
}
return _container;
}
}
这样做将有助于保持VM的可测试性,因为您也可以通过测试注入服务的模拟.
内容总结
以上是互联网集市为您收集整理的c#-依赖注入以在MVVM中以对话框形式启动视图全部内容,希望文章能够帮你解决c#-依赖注入以在MVVM中以对话框形式启动视图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。