1

我正在使用 WPF、MVVM 和 PRISM 区域编写应用程序。

我有两个区域,每个区域有一个视图(A 和 B)。我在我的 regionmodules 类中向我的区域添加视图,如下所示:

    // I use the following private properties in both regionmodules.cs class
    private readonly IUnityContainer _container;
    private readonly IRegionManager _regionManager;

- 一种 -

    private void RegisterViews()
    {
        var controlsView = _container.Resolve<EmulatorControlsView>();
        _regionManager.Regions["ControlsRegion"].Add(controlsView, "A");
    }

--B--

    private void RegisterViews()
    {

        var templatesView = _container.Resolve<TemplatesView>();
        _regionManager.Regions["TemplatesRegion"].Add(templatesView, "B");

        var view = _regionManager.Regions["TemplatesRegion"].GetView("B");
        _regionManager.Regions["TemplatesRegion"].Deactivate(view);
    }

我在我的应用程序初始化期间停用了视图“B”,因为视图 ​​B 覆盖了我的 shell.xaml 中的视图 A。

来自视图 A 的单击命令将根据以下代码激活视图 B 并停用视图 A:

    private void LoadTemplateExecute()
    {
        var controlView = _regionManager.Regions["ControlsRegion"].GetView("A");
        _regionManager.Regions["ControlsRegion"].Deactivate(controlView);

        var templateView = _regionManager.Regions["TemplatesRegion"].GetView("B");
        _regionManager.Regions["TemplatesRegion"].Activate(templateView);
    }

我的模板区域视图模型中存在其他按钮命令,用于停用视图 A 和激活视图 B。

这段代码效果很好,并且允许我按需显示我的视图。

问题:视图 B 有一个 ListView 通过依赖属性绑定到视图模型中的 ObservableCollection。我目前通过视图模型构造函数将字符串项添加到我的 ObservableCollection 中:

    private void InitializeTemporaryLists()
    {
        TemplateList.Add("Dog");
        TemplateList.Add("Cat");
        TemplateList.Add("Horse");
    }  

但是,当视图 B 被激活时,我的 ObservableCollection 不会显示其列表中的项目。

问题:区域视图或视图模型中是否有可用的事件在视图变为活动状态时通知我?
每次我的视图变为活动状态时,我将数据从视图模型填充到我的视图的最佳方式是什么?

非常感谢任何想法和代码示例!

* 更新 * 我的 ListView 没有更新,因为我是一个愚蠢的程序员。我没有在我的依赖属性中声明 ObservableCollection<> 类型。

但是,我仍然很想知道你们那里的聪明程序员如何处理棱镜区域视图激活?我希望我可以订阅如下事件:

_regionManager.Regions["YourRegion"].OnActiveView() += HandleActiveViewEvent;
4

1 回答 1

2

您可以实现该IActiveAware接口以在视图被激活和停用时接收通知。如果您在视图或视图模型(但不是两者)上实现它,则由框架调用。

如果您想从视图或视图模型外部获得激活通知,您还可以监视该区域的ActiveViews集合以进行更改。这支持INotifyCollectionChanged接口。

于 2012-08-28T17:20:32.320 回答