将消息发送到区域中的视图模型的特定实例

时间:2014-02-28 03:49:30

标签: prism eventaggregator

我正在使用棱镜和wpf。我有一个视图,可能有多个具有相应视图模型的实例。问题是我需要在viewmodel中针对特定区域中托管的特定实例的某些事件做一些事情。我正在考虑使用事件聚合器来订阅事件,问题是每个viewmodel创建将订阅同一个事件并且在发布时,每个都将收到我不想要但只希望区域托管实例接收的相同事件消息和进程以及其他人忽略它。

简而言之,我只想向用户控件的viewmodel发送消息,即使usercontrol托管在任何其他区域,该viewmodel也托管在特定区域。

1 个答案:

答案 0 :(得分:1)

实现此目的的一种可能方法是使用 EventAggregator ,但在订阅中使用 过滤器

每个 ViewModel 实例都有一个委托方法,以决定该实例是否会处理事件事件上的 过滤器 将按如下方式执行:

public class MultipleViewModel
{
    private IRegionManager regionManager;

    public MultipleViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
    {
        this.regionManager = regionManager;
        this.eventAggregator.GetEvent<SpecificViewModelHandledEvent>().Subscribe(SpecificViewModelEventHandler, ThreadOption.PublisherThread, false, ViewModelInstanceFilter);
    }

    public bool ViewModelInstanceFilter()
    {
        return this == this.regionManager.Regions["SpecificRegion"].GetView("ViewName").DataContext;
    }

    public void SpecificViewModelEventHandler()
    {
        // Handle the Event on the particular ViewModel instance.
    }
}

因此,该委托方法会将当前的 ViewModel 实例与在特定区域上注册的 ViewModel 实例进行比较。因此,只有实例会在过滤器上返回 true ,并且它只会处理已发布的事件

有关详细信息,请查看以下 MSDN棱镜指南一章:

我希望这有帮助, 问候。


<强>更新

关于评论关于概括解决方案的问题,我想提一下,可以使用单独的 ViewModels 来完成更合适的实现。否则,您不需要只获取一个处理事件的实例。他们都应该承担同样的责任。

无论如何,如果在同一个区域上注册了多个实例,我可以想到一个可能的解决方法:由于您需要通过所有其他实例识别所需的实例,用户可以检查或在所需的查看实例上设置属性作为“ 响应式视图 ”,然后可以在 事件过滤器

当每个 ViewModel 初始化时,您可以将bool Propery 设置为false,并将其绑定到 CheckBox上的查看 ,例如或类似的东西。然后,您可以正确检查查看,您希望处理事件,而其他实例仍未选中,以此方式过滤已发布的事件。

使用这种新方法,您需要修改 ViewModelInstanceFilter() 方法,以便评估此选中的属性。如果您愿意,可以添加服务,以验证同时检查的实例不超过一个。

我希望这有助于你。 问候。