加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:51:16 所属栏目:百科 来源:网络整理
导读:我正在使用Prism和IoC.问题是通过导航传递对象(如集合).我正在看这篇文章: How to Pass an object when navigating to a new view in PRISM 4 这就是解决方案 我提取对象的哈希码并将其保存在Dictionary中,哈希码作为键,对象作为对的值. 然后,我将哈希代码
我正在使用Prism和IoC.问题是通过导航传递对象(如集合).我正在看这篇文章: How to Pass an object when navigating to a new view in PRISM 4

这就是解决方案

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

而已.

我不确定这个解决方案是否最适合传递对象.我想这可能是一项服务.这是一个很好的方法,或者有更好的方法吗?

解决方法

我发布了一个更简单的方法在此提及以供参考 –

我将使用OnNavigatedTo和OnNavigatedFrom方法使用NavigationContext传递对象.

首先从INavigationAware接口派生viewmodel –

public class MyViewModel : INavigationAware
 { ...

然后,您可以实现OnNavigatedFrom并将要传递的对象设置为导航上下文,如下所示 –

void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
{
     SharedData data = new SharedData();
     ...
     navigationContext.NavigationService.Region.Context = data;
}

当您想要接收数据时,在第二个视图模型中添加以下代码 –

void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
{
    if (navigationContext.NavigationService.Region.Context != null)
    {
        if (navigationContext.NavigationService.Region.Context is SharedData)
        {
             SharedData data = (SharedData)navigationContext.NavigationService.Region.Context;
              ...
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读