带参数的 MVVMLight 打开视图
MVVMLight open view with parameter
我正在尝试学习 MVVMLight,但我一直在创建用于编辑对象的新视图。
我有 CustomersView
和 CustomersViewModel
显示客户的数据网格。双击 DataGridRow,我打开一个实现 CustomerViewModel
的 CustomerView
来编辑客户,我在 CustomersViewModel
:
中使用此代码
var cv=new CustomerView();
var cvm=new CustomerViewModel();
cvm.IsEdit = true;
cvm.Customer = customer;
cv.DataContext = cvm;
cv.ShowDialog();
这种方法不好吗?创建视图、使用某些参数实例化视图模型的最佳方法是什么?
Ba 意识到,如果您在 viewModel 中实例化一个视图对象,例如 CustomerView,您将打破 mvvm 模式。如果您的项目会增长,那应该是个问题。
如果你绝对想保持 mvvm 模式,你有两个选择:
1) 创建一个类似
的界面
interface INavigationService
{
NavigateTo(string viewName ,objet params);
}
为此 class 创建一个单例实现。将创建 new CustomerView() 和其他视图的逻辑放入此方法中。主要目标是将视图与其他任何东西分开。尝试使用注入在您的视图模型中仅包含 INavigationService 引用。
2) 像Prism这样的mvvm使用非常重的框架;
编辑:mvvm ligth 5.0 提供了自己的 INavigationService 接口。如果您使用此版本,您可以决定实施它。它不提供任何实现...
见
我正在尝试学习 MVVMLight,但我一直在创建用于编辑对象的新视图。
我有 CustomersView
和 CustomersViewModel
显示客户的数据网格。双击 DataGridRow,我打开一个实现 CustomerViewModel
的 CustomerView
来编辑客户,我在 CustomersViewModel
:
var cv=new CustomerView();
var cvm=new CustomerViewModel();
cvm.IsEdit = true;
cvm.Customer = customer;
cv.DataContext = cvm;
cv.ShowDialog();
这种方法不好吗?创建视图、使用某些参数实例化视图模型的最佳方法是什么?
Ba 意识到,如果您在 viewModel 中实例化一个视图对象,例如 CustomerView,您将打破 mvvm 模式。如果您的项目会增长,那应该是个问题。
如果你绝对想保持 mvvm 模式,你有两个选择:
1) 创建一个类似
的界面interface INavigationService
{
NavigateTo(string viewName ,objet params);
}
为此 class 创建一个单例实现。将创建 new CustomerView() 和其他视图的逻辑放入此方法中。主要目标是将视图与其他任何东西分开。尝试使用注入在您的视图模型中仅包含 INavigationService 引用。
2) 像Prism这样的mvvm使用非常重的框架;
编辑:mvvm ligth 5.0 提供了自己的 INavigationService 接口。如果您使用此版本,您可以决定实施它。它不提供任何实现...
见