1

我正在使用 PRISM 开发复合 WPF 应用程序。我有一个具有父用户控件的窗口。此父用户控件定义了许多子区域。子视图使用 MEF 的“REGIONEXPORT”属性导出自己。每个子视图导入/创建自己的视图模型。父用户控件具有“确定”和“取消”按钮。按“确定”后,我想验证并保存所有子视图模型。如果任何验证失败,则需要知道父用户控件的视图模型。为此,我使用复合命令并将其设置在 RegionContext 中。每个子视图模型都通过区域上下文获取该复合命令,希望您了解基本上我需要在父视图模型和子视图模型之间共享数据。因此,我需要在子视图模型中获取 RegionContext,因为我正在从 RegionManager 的视图模型的构造函数中导入 RegionManager(使用导入构造函数),我获取区域上下文,然后获取命令。

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

1 回答 1

2

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

这种方法不会破坏 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);
}

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

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

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

您需要实施INavigationAware才能开始OnNavigatedTo工作。

编辑:

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

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

共享服务示例

于 2017-02-23T18:10:07.177 回答