Prism区域视图按需显示,如何在活动视图中刷新控件

时间:2012-08-28 15:57:19

标签: c# wpf mvvm prism

我正在使用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;

- A -

    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通过依赖项属性将ViewView绑定到视图模型中的ObservableCollection。我目前通过视图模型构造函数将字符串项添加到我的ObservableCollection中:

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

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

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

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

*更新* 我的ListView没有更新,因为我是一个愚蠢的程序员。我没有宣布ObservableCollection&lt;&gt;输入我的依赖属性。

但是,我仍然很想知道那里的智能程序员如何处理棱镜区域视图激活?我希望我能订阅以下活动:

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

1 个答案:

答案 0 :(得分:2)

您可以实现IActiveAware界面,以便在激活和停用视图时接收通知。如果在视图或视图模型上实现它(但不是两者),框架将调用此方法。

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