WPF PRISM / Unity viewModel参数

时间:2013-01-05 21:30:27

标签: wpf navigation unity-container prism-4

我有一个用于添加或编辑客户的视图和相应的视图模型。

如果我单击Add new customer按钮,unity会为我提供一个漂亮的新CustomerView,并传入我的datacontext和视图模型,以及作为构造函数参数的客户对象。

我保存了我的客户,现在想要从我的数据网格中查看另一个现有的客户记录。

我有一个接受来自datagrid的selectedItem(Customer)的命令,现在我想在View模型的构造函数中将它作为参数传递给我的CustomerView。

如何告诉Unity我现在想用Client参数构建我的Views视图模型然后导航到视图?

修改的 我在CustomerModule中注册我的视图,并将Customers启动按钮添加到导航区域,如下所示:

public void Initialize()
{
    _container.RegisterType<ICustomerMainView, CustomerMainView>();
    _container.RegisterType<ICustomerMainViewViewModel, CustomerMainViewViewModel>();
    _container.RegisterType<ICustomerView, CustomerView>();
    _container.RegisterType<ICustomerViewViewModel, CustomerViewViewModel>();
    _container.RegisterType<ICustomerNavIconView, CustomerNavIconView>();
    _container.RegisterType<ICustomerNavIconViewModel, CustomerNavIconViewModel>();
    //var view = _container.Resolve<ICustomerMainView>();
    //var view1 = _container.Resolve<ICustomerView>();

    _regionManager.RegisterViewWithRegion("NavigationRegion", typeof(Views.CustomerNavIconView));
}

要添加新客户,我有一个以下命令:

private void OnAddNewCustomer()
{
    try
    {
        _regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.CustomerView));
        _regionManager.RequestNavigate("MainRegion", "CustomerView");
    }
    catch (Exception ex)
    {

    }
}

这很好,我可以添加新客户并保存详细信息。现在,如果我想通过双击网格中的记录来查看我保存的客户,我有一个如下命令但不知道如何设置CustomerViewViewModel&#34;客户&#34;参数是我的selectedItem(客户)????

private void OnViewCustomer(Customer customer)
{
    try
    {
        _unityContainer.Resolve<ICustomerViewViewModel>(new ParameterOverride("customer", customer));
        _regionManager.RequestNavigate("MainRegion", "CustomerView");
    }
    catch (Exception ex)
    {

    }
}

感谢。

3 个答案:

答案 0 :(得分:0)

我不认为Prism支持将对象/类传递给导航请求。但是,您可以将string / id传递给接收方法。这是你如何做到的:

var query = new UriQuery();
query.Add("Customer", Customer.Id);
_regionManager.RequestNavigate("MainRegion",
         new Uri("CustomerView" + query.ToString(), UriKind.Relative));

现在,您可以使用此ID并从数据库或任何地方获取对象。

答案 1 :(得分:0)

所以我做的是以下内容:

var clientView = _unityContainer.Resolve<IClientView>(new ParameterOverride("clientId", client.ClientId).OnType<ClientViewViewModel>());
                _regionManager.Regions["MainRegion"].Add(clientView);
                _regionManager.RequestNavigate("MainRegion", "ClientView");

本质:

  1. 如果我的ClientViewViewModel实现了IRegionMemberLifetime接口并且KeepAlive属性返回False,以确保每次导航到我的视图时都创建一个新的ViewModel。
  2. 统一解析我的新ClientView覆盖了ClientViewViewModel的“client”参数。
  3. 将我新解析的视图添加到我想要在
  4. 中显示的区域
  5. 导航到我的视图

答案 2 :(得分:0)

这是两个链接,我想你想知道。

Prism/Unity Navigation question

ParameterOverride in WPF/PRISM/MVVM