我正在尝试控制何时创建新视图以及何时显示现有视图。
这是Prism文档中“导航到现有视图”部分中概述的非常类似的场景,但我无法让它完全运行: http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx
我发现我可以创建视图/视图模型以开始,但是我无法创建它的新实例。即我希望一次存在多个实例。
以下是视图模型的示例:
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class DataEntryPageViewModel : INavigationAware, IRegionMemberLifetime
{
private Guid id;
[ImportingConstructor]
public DataEntryPageViewModel()
{
id = Guid.NewGuid();
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
// In actual fact there would be more logic here to determine
// whether this should be shown to the user
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
public bool KeepAlive
{
// For the purposes of this example we don't want the view or the viewModel
// to be disposed of.
get { return true; }
}
}
我按照以下方式导航:
m_RegionManager.RequestNavigate(
"MainRegion",
new Uri("/DataEntryPageView", UriKind.Relative));
所以第一次调用上面的视图时会显示出来。
下次我调用RequestNavigate时,会触发IsNavigationTarget并返回false。我当时希望它做的是创建一个新实例,但这不会发生。我知道它没有发生,因为构造函数没有被命中,UI也没有更新以显示视图的新实例。
任何想法如何让它创建一个新实例?
非常感谢,
保
修改
我注意到第二次调用RequestNavigate(请求同一视图的另一个实例)时,回调会报告错误“视图已存在于区域中”。因此,似乎我可以在一个区域中有多个不同视图的实例,但不能在同一视图的多个实例中。我对此的理解并不是很好,但我可能是错的。
答案 0 :(得分:0)
为什么要在创建新视图时不创建视图?在我看来,你正在使用MEF。
答案 1 :(得分:0)
您应该在视图中使用合同名称为[Export]
的{{1}}属性。
答案 2 :(得分:0)
我现在能够让它工作,这是因为我没有
[PartCreationPolicy(CreationPolicy.NonShared)]
关于视图的类声明。我在ViewModel上有它。
所以这现在导致了我所期望的行为。
感谢Zabavsky和Alan的建议。