棱镜:IRegionMemberLifetime在某些情况下不起作用

时间:2011-05-28 16:10:05

标签: .net wpf silverlight prism

我正在尝试使用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并未找到答案......

1 个答案:

答案 0 :(得分:0)

您使用了两种类型的控件:

ContentControl和TabControl将使用SingleActiveRegion的Region Adapter。基本上,一次只能显示一个视图。

Grid和ItemsControl可能都是AllActiveRegion(ItemsControl肯定是,不知道你的GridAdapter),这意味着他们可以一次显示多个视图。

查看NavigationService,这是区域用于从视图X移动到视图Y的内容,这就是:

  1. 通知活动视图它已不再有效。

  2. 加载     新观点。如果它已经存在(并且视图实现了     IActiveAware)它会反应它。否则它会创建一个 新     视图的实例

  3. 触发导航事件

  4. 通知“y”     查看它正在导航到。同样,观点必须 实行     IActiveAware

  5. 引发NavigatedEvent。

  6. 所以:

    您的观点是否实施了IActiveAware?

    更重要的是,如果你正在使用一次可以显示多个视图的容器(ItemsControl等),那么我认为你需要手动删除该区域的视图,因为Prism不打算这样做你!

    你可以相当容易地做到这一点。您可以编写自己的实现INavigationService的类,然后将其插入到Region的NavigationService属性中。这使您可以控制导航服务正在执行的操作。

    希望这有帮助。