导航到 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 中的新视图时如何传递对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]