【问题标题】:Prism: IRegionMemberLifetime doesn't work in some scenariosPrism:IRegionMemberLifetime 在某些情况下不起作用
【发布时间】:2011-09-04 00:04:58
【问题描述】:

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

【问题讨论】:

  • 那么您的问题是您希望作为项目控件的网格具有内容控件的行为?

标签: .net wpf silverlight prism


【解决方案1】:

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

ContentControl 和 TabControl 将使用使用 SingleActiveRegion 的区域适配器。基本上,一次只能显示一个视图。

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

查看 NavigationService,Region 使用它来从视图 X 移动到视图 Y,会发生以下情况:

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

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

  3. 触发导航事件

  4. 通知“y” 查看它正在被导航到。再次,视图必须 实施 IActiveAware

  5. 引发 NavigatedEvent。

所以:

您的视图是否实现了 IActiveAware?

更重要的是,如果您使用的容器可以同时显示多个视图(ItemsControl 等),那么我认为您需要手动从区域中删除视图,因为 Prism 不会这样做你!

您实际上可以很容易地做到这一点。您可以编写自己的实现 INavigationService 的类,然后将其插入到 Region 的 NavigationService 属性中。这使您可以控制导航服务正在做什么。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2017-06-29
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多