我也有类似的问题但不明白这页上的答案。
Am I doing it correctly do deal with multiple instances of same view in MVVM / Prism / WPF
我想做的是以下几点。
我有一个主窗口的主要应用程序,在那个窗口上我有一个tabcontrol,它有一个叫做tabregion的区域。
然后我有我有一个模块与mainView与2区域'region1'和'region2'和这个视图中的tabcontrol加载在主窗口.
然后我有一个视图(VideoPanel)女巫是非常大(流摄像头的视图)我真的很想有机会流2个摄像头(或更多)在一个页面上具有相同的视图(VideoPanel),所以我想加载视图(Videopanel)到区域1和2。
这就是我现在在模块中所做的
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("Video1Region", typeof(VideoPanel));
regionManager.RegisterViewWithRegion("Video2Region", typeof(VideoPanel));
}
它可以工作,但并不完美。因为我使用的一些设置是混乱的。
然后,我尝试在加载mainView时加载区域中的视图(VideoPanel),然后向其添加参数
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCmd}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
private void LoadedCmd(RoutedEventArgs args)
{
var par1 = new NavigationParameters
{
{ "Id", 1 }
};
_regionManager.RequestNavigate("Region1", nameof(VideoPanel), par1);
var par2 = new NavigationParameters
{
{ "Id", 2 }
};
_regionManager.RequestNavigate("Region2", nameof(VideoPanel), par2);
}
但是导航感知在视图(VideoPanel)中不起作用,所以我没有得到我想发送给我的视图模型的ID。
我希望你能理解我的问题,因为我的英语不是很好。
1条答案
按热度按时间b4wnujal1#
因为我是你所链接的帖子的作者,我将尝试解释我是如何在我们的应用程序中完成的。
首先要确保ViewModel实现了INavigationAware,但就你的帖子而言,你似乎已经实现了。
然后,我们已经在模块中注册了用于导航的视图
因此,如果您删除了RegisterViewWithRegion,则需要在您拥有regionManager的某个位置进行调用(例如通过依赖注入)
根据您放置这些调用的位置(每个示例一个),您应该有一个标记,以便在每个区域只执行一次导航。请注意,区域可能不会创建得太早。
最后,在Viewmodel中,您可以在IsNavigationTarget中管理参数,以便在需要时创建新示例,也可以在OnNavigatedTo中管理参数,具体取决于如何处理参数。