【发布时间】:2016-04-13 06:57:44
【问题描述】:
假设我有一个显示通用客户列表的视图。在这种情况下,我将实现一个CustomersViewModel,其中RelayCommand 绑定到XAML 按钮,下载它并填充Customer 的ObservableCollection,绑定到ListView。
如果我想定义一个CustomerDetailView,一个显示有关客户的一些其他信息的视图,我将创建一个CustomerDetailViewModel,一个CustomerView,并重复相同的逻辑。但不同的是,ViewModel 必须将选择的 Customer 作为参数,而 CustomersViewModel 每次都可以显示而无需外部参数。
在 WinForm 解决方案中,我会放置一个参数来构造我需要的对象的表单。
我的问题是:为了尊重 MVVM 模式,实现此类导航的正确方法是什么?
我的导航逻辑:
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
var nav = new NavigationService();
nav.Configure("CustomersView", typeof(CustomersView));
nav.Configure("CustomerDetailView", typeof(CustomerDetailView));
SimpleIoc.Default.Register<INavigationService>(() => nav);
SimpleIoc.Default.Register<CustomersViewModel>();
SimpleIoc.Default.Register<CustomerDetailViewModel>();
}
private RelayCommand _navigateToCustomerDetailCommand;
public RelayCommand NavigateToCustomerDetailCommand
{
get
{
return _navigateToCustomerDetailCommand
?? (_navigateToCustomerDetailCommand = new RelayCommand(
() =>
{
_navigationService.NavigateTo("CustomerDetail");
}
{
}
我想到的选项:
以某种方式将参数传递给“NavigateTo”函数,并在构造函数中使用该参数定义相对 ViewModel。虽然对我来说这似乎是合理的,但我没有找到这样做的方法。
-
如上导航,然后向 ViewModel 发送消息。这个想法是有效的,但我不相信它。在我看来,这似乎是一种将简单的事情复杂化的方法。
return _navigateToCustomerDetailCommand ?? (_navigateToCustomerDetailCommand = new RelayCommand( () => { _navigationService.NavigateTo("CustomerDetail"); Messenger.Default.Send(new CustomMessageCustomerSelected(SelectedCustomer)); }并在 ViewModel 中监听该消息:
public CustomerDetailViewModel(NavigationService _navigationService) { // ... Messenger.Default.Register<CustomMessageCustomerSelected> ( this, (action) => { SelectedCustomer = action.Value; } ); // ... }
【问题讨论】:
标签: c# wpf xaml mvvm mvvm-light