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

时间:2012-02-16 23:20:05

标签: c# wpf navigation prism

据我所知,目前PRISM允许传递字符串,但不允许传递对象。我想知道克服这个问题的方法是什么。

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我有自己的技术。

我提取对象的哈希码并将其保存在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);
    }
}

就是这样。

答案 2 :(得分:0)

您可以使用'object'getter / setter创建PRISM事件。升级事件,您的对象被转换或未转换为事件内的'对象'(取决于事件实现'共享',如在着名的'基础设施'项目中),然后导航到区域。在ViewModel中实现Region - Subscribe()到上面的事件,接收它并在本地存储然后只需等待'OnNavigatedTo'函数调用。当调用OnNavigatedTo函数时,您已经拥有了对象/ class / struct并且可以运行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;
     }

答案 3 :(得分:0)

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

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