我正在尝试使用Prism 4创建一个Silverlight应用程序,我正在测试它的导航功能。我想在单击按钮时在两个视图之间切换。第一种观点是:
public partial class HomeView
{
public HomeView(HomeViewModel viewModel)
{
DataContext = viewModel;
InitializeComponent();
}
}
和ViewModel:
public class HomeViewModel : NotificationObject, IRegionMemberLifetime
{
private readonly IRegionManager _regionManager;
public DelegateCommand SubmitCommand { get; set; }
public bool KeepAlive { get { return false; } }
public HomeViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
SubmitCommand = new DelegateCommand(Submit);
}
private void Submit()
{
_regionManager.RequestNavigate("Home", new Uri(typeof(UsersView).Name, UriKind.Relative));
}
}
问题是当我将“Home”区域设置为ItemsControl,Grid(带适配器)时 - 它不会进入KeepAlive属性,只是将第二个视图添加到该区域,我看到它们都是
当区域被定义为ContentControl或TabControl时 - 它会删除HomeView并添加UsersView!
谁能告诉我我做错了什么?我想用一个网格作为实现这个目标的区域。
我已阅读本章http://msdn.microsoft.com/en-us/library/gg430861%28v=pandp.40%29.aspx并未找到答案......
答案 0 :(得分:0)
您使用了两种类型的控件:
ContentControl和TabControl将使用SingleActiveRegion的Region Adapter。基本上,一次只能显示一个视图。
Grid和ItemsControl可能都是AllActiveRegion(ItemsControl肯定是,不知道你的GridAdapter),这意味着他们可以一次显示多个视图。
查看NavigationService,这是区域用于从视图X移动到视图Y的内容,这就是:
通知活动视图它已不再有效。
加载 新观点。如果它已经存在(并且视图实现了 IActiveAware)它会反应它。否则它会创建一个 新 视图的实例
触发导航事件
通知“y” 查看它正在导航到。同样,观点必须 实行 IActiveAware
引发NavigatedEvent。
所以:
您的观点是否实施了IActiveAware?
更重要的是,如果你正在使用一次可以显示多个视图的容器(ItemsControl等),那么我认为你需要手动删除该区域的视图,因为Prism不打算这样做你!
你可以相当容易地做到这一点。您可以编写自己的实现INavigationService的类,然后将其插入到Region的NavigationService属性中。这使您可以控制导航服务正在执行的操作。
希望这有帮助。