导航到 PRISM 中的新视图时如何传递对象?

Posted

技术标签:

【中文标题】导航到 PRISM 中的新视图时如何传递对象?【英文标题】:How to pass an object when navigating to a new view in PRISM? 【发布时间】:2012-03-08 09:41:02 【问题描述】:

据我所知,目前 PRISM 允许传递字符串,但不允许传递对象。我想知道有什么方法可以解决这个问题。

我想传递一个列表集合。 UriQuery 在我的情况下没有用,在这种情况下我该怎么办?

【问题讨论】:

【参考方案1】:

Prism 5 和 6:NavigationParameters 类现在可用于在导航期间传递对象参数,使用 Region 或 RegionManager 实例的 RequestNavigate 方法的重载。

【讨论】:

最好加个例子甚至是链接【参考方案2】:

我有自己的技巧。

我提取对象的哈希码并保存在Dictionary中,哈希码作为键,对象作为对的值。

然后,我将哈希码附加到UriQuery

之后,我只需要获取来自目标视图上的 Uri 的哈希码,并使用它来向 Dictionary 请求原始对象。

一些示例代码:

参数库类:

public class Parameters

    private static Dictionary<int, object> paramList =
        new Dictionary<int, object>();

    public static void save(int hash, object value)
    
        if (!paramList.ContainsKey(hash))
            paramList.Add(hash, value);
    

    public static object request(int hash)
    
        return ((KeyValuePair<int, object>)paramList.
                    Where(x => x.Key == hash).FirstOrDefault()).Value;
    

调用者代码:

UriQuery q = null;
Customer customer = new Customer();
q = new UriQuery();
Parameters.save(customer.GetHashCode(), customer);
q.Add("hash", customer.GetHashCode().ToString());

Uri viewUri = new Uri("MyView" + q.ToString(), UriKind.Relative);
regionManager.RequestNavigate(region, viewUri);

目标视图代码:

public partial class MyView : UserControl, INavigationAware

// some hidden code

    public void OnNavigatedTo(NavigationContext navigationContext)
    
        int hash = int.Parse(navigationContext.Parameters["hash"]);
        Customer cust = (Customer)Parameters.request(hash);
    

就是这样。

【讨论】:

只有一件事,您认为.. 参数是静态类还是不是服务更好? 好吧。这是我在尝试完成功能工作时所做的一种解决方法。欢迎任何形式的改进。如果您改进了示例,请在此处分享。 ;) 再见 由于您将实例放在参数“缓存”中,然后传递“密钥”,您可能只想创建一个新的 Guid(它是唯一的,而不是散列,它不是) ,并在检索到对象后将其从缓存中释放。 正如@BahriGungor 所说,散列不是唯一键,不应该这样使用。【参考方案3】:

您可以使用“对象”getter/setter 创建 PRISM 事件。将您的对象投射或未投射到事件内部的“对象”的上升事件(取决于事件实现是否像著名的“基础设施”项目中那样“共享”),然后导航到区域。在实现 Region - Subscribe() 到上述事件的 ViewModel 中,接收它并在本地存储,然后等待“OnNavigatedTo”函数调用。当调用 OnNavigatedTo 函数时,您已经拥有对象/类/结构并且可以运行 ViewModel。

例如 - 事件类:

namespace CardManagment.Infrastructure.Events

    using Microsoft.Practices.Prism.Events;

    /// <summary>
    /// Event to pass 'Selected Project' in between pages
    /// </summary>
    public class SelectedProjectViewEvent : CompositePresentationEvent<SelectedProjectViewEvent>
    
        public object SelectedPorject  get; set; 
    

'调用'类

/// <summary>
/// Called when [back to project view].
/// </summary>
/// <param name="e">The e.</param>
public void OnBackToProjectView(CancelEditProjectEvent e)

   eventAggregator.GetEvent<SelectedProjectViewEvent>().Publish(new SelectedProjectViewEvent()
   
       SelectedPorject = selectedProject
   );

   regionManager.RequestNavigate(WellKnownRegionNames.ProjectViewRegion, new System.Uri("ProjectDetailsView", System.UriKind.Relative));
 

这在“接收者”类中

    /// <summary>
    /// Called when the implementer has been navigated to.
    /// </summary>
    /// <param name="navigationContext">The navigation context.</param>
    public void OnNavigatedTo(NavigationContext navigationContext)
    
        if (this.SelectedProject == null)   // <-- If event received untill now
            this.ShouldBeVisible = false;
        else
            this.ShouldBeVisible = true;
     

【讨论】:

【参考方案4】:

如果您正在使用 IOC 并希望使用构造函数注入,您还可以查看如何传递对象。

https://***.com/a/20170410/1798889

【讨论】:

以上是关于导航到 PRISM 中的新视图时如何传递对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 PRISM 4 中导航到新视图时如何改进传递对象

Prism:如何在区域中注入视图模型实例?

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]

如何将对对象的引用传递给包含在导航控制器中的模态呈现的视图控制器?

导航到模块中的视图时不调用 OnNavigatedTo

从 JSF2 中的操作导航时如何传递视图参数?