在viewmodel中使用prism的RegionManager引用是一种好习惯

时间:2017-02-23 15:07:33

标签: wpf mvvm prism prism-5

我正在使用PRISM开发复合WPF应用程序。我有一个具有父UserControl的窗口。此父usercontrol定义了许多子区域。儿童观点使用MEF" REGIONEXPORT"属性。每个子视图都导入/创建自己的视图模型。父用户控件有" OK"和"取消"按钮。按下" OK"我想验证并保存所有childviewmodels。如果任何验证失败,则父用户控件的viewmodel需要知道。为了实现这一点,我使用复合命令并在RegionContext中设置它。每个子视图模型通过区域上下文获取该复合命令,并希望您了解基本上我需要在父视图模型和子视图模型之间共享数据。所以我需要在子视图模型中获取RegionContext以便我导入在RegionManager的viewmodel构造函数中使用RegionManager(使用导入construtor),我得到区域上下文,然后是命令。

public class FooViewModel
{
     [ImportingConstructor]
     public FooViewModel(IRegionManager regionManager)
     {
        var regionContext = regionManager.RegionContext;
     }
}
  1. 在viewmodel中拥有区域管理器是否很好?
  2. 这不会破坏MVVM吗?我们在viewmodels中查看相关内容
  3. 是否有更好的方法在视图模型(事件聚合器除外)之间共享数据

1 个答案:

答案 0 :(得分:1)

通过视图模型的构造函数获取区域管理器的引用并不罕见。这是获得它的首选方法。当我需要使用区域管理器进行导航时,我一直这样做。

这种方法不会破坏MVVM。虽然,我不确定你打算用RegionContext本身做什么。

将数据从一个VM传递到另一个VM的另一种方法是通过NavigationParameters和区域管理器RequestNavigate功能。下面是一个例子。

private readonly IRegionManager _regionManager;

public YourViewModel(IRegionManager regionManager)
{
    _regionManager = regionManager;
}

Private void DoNavigation()
{
    var parameters = new NavigationParameters();
    parameters.Add("Key", <a value or an object to pass>);
    _regionManager.RequestNavigate(“ContentRegion”, “YourViewName”, parameters);
}

您可以在接收VM的OnNavigatedTo方法中检查参数集合的值。

public override void OnNavigatedTo(NavigationContext navigationContext)
{
    var paramKey = navigationContext.Parameters.Where(item => item.Key == "Key").FirstOrDefault();

    if (paramKey.Value != null)
    {
        // Do something…
    }    
}

您需要实施INavigationAware才能让OnNavigatedTo发挥作用。

修改

如果您希望数据共享更加松散地通过区域上下文与另一个视图模型进行通信,并且您不想使用事件聚合器,那么共享服务可能是另一种方式。

使用共享服务,部分或全部视图模型可以对其进行引用,并且当服务中的属性发生更改时,任何引用它的对象都可以执行操作。此共享服务可以实现Prism附带的BindableBase,因此会在发生更改时通知。使用您正在使用的任何容器注册共享服务,在视图模型的ctor中获取它,根据需要引用属性。

Shared Service Example