我有两个XAML页面,每个页面都是不同MVVM模式的一部分;称他们为PageA和PageB。每个MVVM框架都在不同的命名空间和项目中,因为它们之间没有合作;称它们为SpaceA和SpaceB,以及ProjectA和ProjectB。
除外:在某些时候,SpaceA框架想要导航到PageB,而在另一点上,SpaceB想要导航到PageA。 明显的挑战是这(不可避免地?)导致框架之间的循环引用:
Frame.Navigate(typeof(SpaceA.PageA)); /* circular */ Frame.Navigate(typeof(SpaceB.PageB));
<<这个问题的原始形式没有代码,这可能使它太模糊或广泛。所以我添加了它。>>
以下是PageA的代码:
<Page x:Class="SpaceA.PageA" ...><Button Tapped="onTap">Go to Page B</Button>
使用CodeBehind
namespace SpaceA
{
public sealed partial class PageA : Page
{
private void onTap(...) { Frame.Navigate(typeof(SpaceB.PageB)); }
}
}
这是PageB的代码:
<Page x:Class="SpaceB.PageB" ...><Button Tapped="onTap">Go to Page A</Button>
使用CodeBehind
namespace SpaceB
{
public sealed partial class PageB : Page
{
private void onTap(...) { Frame.Navigate(typeof(SpaceA.PageA)); }
}
}
为简单起见,我遗漏了VM和Model元素中的所有(相当复杂的)逻辑。但它们之间没有耦合,除了页面相互调用。由于循环依赖,上述内容不会组合。
我可以看到几种解决方案。
我可以将它们全部组合到同一个命名空间中;但这似乎很可惜,因为它们只是偶然通过这种交叉导航,这就是我计划将它们放在不同组件中的原因。虽然我在使用命名空间时可能过于精细了?
或者我可以通过在第三个名称空间中知道SpaceA和SpaceB的两个虚拟页面来做一些奇特的事情,以便通过该虚拟页面完成导航。但这看起来很丑陋,因为我必须纠正后退/前进导航堆栈,我想。
或者将页面本身移动到他们自己的共享空间,比如SpacePage,然后将其余的MVVM模式留在各自的空间中?
但似乎这应该是一种常见的模式,并且应该比上述任何一种更清晰地解决。
答案 0 :(得分:0)
问题在于我混淆了命名空间和项目的语义。
将每个MVVM放在不同的命名空间中没有问题;问题是每个人都在一个不同的项目中。解决方案是将它们移动到所有相同的项目中,理想情况是在单独的文件夹中以维护结构。