【问题标题】:WPF PRISM/Unity viewModel parameterWPF PRISM/Unity viewModel 参数
【发布时间】:2013-01-05 21:30:26
【问题描述】:

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

如果我单击“添加新客户”按钮,unity 会为我连接一个漂亮的新客户视图,并传入我的数据上下文和视图模型,以及作为构造函数参数的客户对象。

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

我有一个从数据网格接受 selectedItem(客户)的命令,现在我想在视图模型的构造函数中将它作为参数传递给我的 CustomerView。

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

编辑 我在 CustomerModule 中注册了我的视图,并向导航区域添加了一个客户启动按钮,如下所示:

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“客户”参数设置为我的 selectedItem(Customer)????

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

    }
}

谢谢。

【问题讨论】:

  • 请添加相关代码....

标签: wpf navigation unity-container prism-4


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    所以我做了以下事情:

    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 的“客户端”参数。
    3. 将我新解析的视图添加到我想要显示的区域
    4. 导航到我的视图

    【讨论】:

      【解决方案3】:

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

      Prism/Unity Navigation question

      ParameterOverride in WPF/PRISM/MVVM

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2017-11-21
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多