使用EventAggregator在ElementHost中的WPF和主机WinForm之间进行通信

时间:2012-03-28 14:59:08

标签: c# wpf winforms

我可以使用EventAggregator订阅从ViewModel发布的WinForm中的事件吗?

我需要将来自WPF复合应用程序模块的ElementHost中承载WPF复合应用程序的WinForm的属性更改为described here

我认为要解决这个问题,我可以使用EventAggregator在ViewModel中发布可由WinForm订阅的事件。这个事件的参数可能包括我想在WinForm上改变的东西,如标题。

我已经阅读了以下内容:

http://msdn.microsoft.com/en-us/library/ff921173%28v=PandP.40%29.aspx

http://www.codeproject.com/Articles/355473/Prism-EventAggregator-Sample

http://msdn.microsoft.com/en-us/library/ff649187.aspx

但是,如果EventAggregator在这种情况下适合用途,我仍然无法解决。

Event Aggregator

2 个答案:

答案 0 :(得分:1)

如果所有这些组件都在同一个过程中,那么您可以使用EventAggregator

请记住,您必须在发布商和订阅者中引用聚合器的相同的实例 - 聚合器应该是单例或作为单例放在IoC容器中

答案 1 :(得分:0)

我最终使用了EventAggregator。这里是VB.NET中的代码,就像我在这个特定项目中使用的那样。

<强> 1。 EventAggregatorSingleton

Imports System.Threading
Imports System.Runtime.InteropServices
Imports Microsoft.Practices.Composite.Events

Public Class EventAggregatorSingleton

Private Shared _currentEventAggregator As EventAggregator
Private Shared _syncLock As Object = New Object()

Public Shared ReadOnly Property CurrentEventAggregator As EventAggregator
    Get
        If _currentEventAggregator Is Nothing Then
            SyncLock _syncLock
                If _currentEventAggregator Is Nothing Then
                    Dim currEventAggregator As New EventAggregator
                    _currentEventAggregator = currEventAggregator
                End If
            End SyncLock
        End If
        Return _currentEventAggregator
    End Get
End Property

End Class

<强> 2。活动类

Public Class ChartWizardPageChangedEvent
Inherits CompositePresentationEvent(Of WpfHostForm)

End Class

第3。从ViewModel发布事件

EventAggregatorSingleton.CurrentEventAggregator.GetEvent(Of ChartWizardPageChangedEvent)().Publish(_chartWizard)

<强> 4。订阅来自WinForm的活动

EventAggregatorSingleton.CurrentEventAggregator.GetEvent(Of ChartWizardPageChangedEvent)().Subscribe(New Action(Of WpfHostForm)(AddressOf App_HostFormChanged))