我正在使用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;
答案 0 :(得分:2)
您可以实现IActiveAware
界面,以便在激活和停用视图时接收通知。如果在视图或视图模型上实现它(但不是两者),框架将调用此方法。
如果您想要从视图或视图模型外部进行激活通知,您还可以监视区域的ActiveViews
集合以进行更改。这支持INotifyCollectionChanged
接口。