【问题标题】:Prism region view display on demand, how to refresh controls in active view棱镜区域视图按需显示,如何在活动视图中刷新控件
【发布时间】:2012-08-23 04:31:19
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多