gpt4 book ai didi

wpf - PRISM WPF - 导航每次都会创建新 View

转载 作者:行者123 更新时间:2023-12-02 18:59:20 25 4
gpt4 key购买 nike

我在 WPF 中将 PRISM 4 导航 API 与 Unity 结合使用。我有一个 TreeView ,它启动一个 RequestNavigate 并传入所选树节点的 ID (GUID)。

_regionManager.RequestNavigate(RegionNames.DetailRegion,
ViewNames.SiteView + "?ID=" + site.ID);

在我的模块中,我已经注册了 View / View 模型,如下所示:

_container.RegisterType<SiteDetailsViewModel>();
_container.RegisterType<object, SiteDetailsView>(ViewNames.SiteView);

当我从 TreeView 中选择不同的节点时,DetailsRegion 按预期显示 SiteDetailsView,但当我想导航回同一节点时,会显示一个新 View /view-model 已创建。

我尝试在 IsNavigationTarget(NavigationContext navigationContext) 处中断,但似乎永远不会调用此方法。

我哪里出错了?提前致谢。

最佳答案

问题出在我从未预料到的地方...调试导航 API 将我引导到 RegionNavigationContentLoader

public object LoadContent(IRegion region, NavigationContext navigationContext)

当我进一步深入代码时,我注意到对以下内容的调用:

protected virtual IEnumerable<object> GetCandidatesFromRegion(
IRegion region,
string candidateNavigationContract)

我注意到这里的命名是将 View 与 View 模型匹配的关键。

在我的示例中,每个部分的名称是:

public class SiteDetailsViewModel { ... } // ViewModel

public class SiteDetailsView { ... } // View

ViewNames.SiteView = "SiteView" // ViewName constant

当我无意中进行了以下更改时:

ViewName.SiteView = "SiteDetailsView"

一切正常。

结论

The name of the ViewModel must start with the same name you used to identify your view.

我通过将 View 更改为来测试这一点:

public class MyView { ... }

并且仍然使用相同的 View 名称来注册容器和导航:

_container.RegisterType<object, MyView>(ViewNames.SiteView);

...

_regionManager.RequestNavigate(RegionNames.DetailRegion,
ViewNames.SiteView + "?ID=" + site.ID);

这似乎也有效。因此, View 模型的名称似乎与用于导航到该 View 的 View 名称有着内在的联系。

注意

仅当您将 IoC 和 Unity 与 PRISM 4 导航 API 结合使用时才会出现这种情况。使用 MEF 时似乎不会发生这种情况。

进一步调查

我还知道一些guides告诉我们在向容器注册 View 时使用 typeof(MyView).FullName...

_container.RegisterType<object, MyView>(typeof(MyView).FullName);

我个人认为这是一个错误。通过使用 View 的全名,您将在 View 和任何希望导航到该 View 的人之间创建依赖关系...

_regionManager.RequestNavigate(RegionNames.DetailRegion,
typeof(MyView).FullName + "?ID=" + site.ID);

关于wpf - PRISM WPF - 导航每次都会创建新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6288839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com