Silverlight 我可以删除EventAggregator中的重复事件吗?

Silverlight 我可以删除EventAggregator中的重复事件吗?,silverlight,events,mvvm,prism,eventaggregator,Silverlight,Events,Mvvm,Prism,Eventaggregator,我有一个非常简单的场景,我无法正常工作。我有两个视图,CarView和CarWindowView childwindow以及相应的视图模型。在我的车视图中,我有一个编辑按钮,可以打开车窗口视图子窗口,在那里我可以编辑车对象字段 我的问题是我的CarWindowView ViewModel中的DisplayModule方法被调用的次数太多了…当我第一次按下edit按钮时,它被调用了一次,第二次被调用了twince,第三次被调用了3次,依此类推 CarView视图模型构造函数: Public Sub

我有一个非常简单的场景,我无法正常工作。我有两个视图,CarView和CarWindowView childwindow以及相应的视图模型。在我的车视图中,我有一个编辑按钮,可以打开车窗口视图子窗口,在那里我可以编辑车对象字段

我的问题是我的CarWindowView ViewModel中的DisplayModule方法被调用的次数太多了…当我第一次按下edit按钮时,它被调用了一次,第二次被调用了twince,第三次被调用了3次,依此类推

CarView视图模型构造函数:

Public Sub New(ByVal eventAggregator As IEventAggregator, ByVal con As IUnityContainer, ByVal mgr As ICarManager, ByVal CarService As ICarService)

    _Container = con
    _CarManager = mgr
    _EventAggregator = eventAggregator

    'Create the DelegateCommands
    NewBtnClick = New DelegateCommand(Of Object)(AddressOf HandleNewCarBtnClick)
    EditBtnClick = New DelegateCommand(Of Object)(AddressOf HandleEditCarBtnClick)
End Sub
Public Sub New(ByVal eventAggregator As IEventAggregator, ByVal con As IUnityContainer, ByVal mgr As ICarManager, ByVal CarService As ICarService)

    _Container = con
    _CarManager = mgr
    _EventAggregator = eventAggregator

    _EventAggregator.GetEvent(Of CarCollectionEvent).Subscribe(AddressOf DisplayModule)

End Sub
CarView ViewModel HandleEditCarbtClick方法:

Private Sub HandleEditCarBtnClick()

    Dim view = New CarWindowView
    Dim viewModel = _Container.Resolve(Of CarWindowViewModel)()
    viewModel.CurrentDomainContext = DomainContext

    viewModel.CurrentItem = CurrentItem
    viewModel.IsEnabled = False

    view.ApplyModel(viewModel)
    view.Show()

    _EventAggregator.GetEvent(Of CarCollectionEvent)().Publish(EditObject)
End Sub
CarWindowView视图模型构造函数:

Public Sub New(ByVal eventAggregator As IEventAggregator, ByVal con As IUnityContainer, ByVal mgr As ICarManager, ByVal CarService As ICarService)

    _Container = con
    _CarManager = mgr
    _EventAggregator = eventAggregator

    'Create the DelegateCommands
    NewBtnClick = New DelegateCommand(Of Object)(AddressOf HandleNewCarBtnClick)
    EditBtnClick = New DelegateCommand(Of Object)(AddressOf HandleEditCarBtnClick)
End Sub
Public Sub New(ByVal eventAggregator As IEventAggregator, ByVal con As IUnityContainer, ByVal mgr As ICarManager, ByVal CarService As ICarService)

    _Container = con
    _CarManager = mgr
    _EventAggregator = eventAggregator

    _EventAggregator.GetEvent(Of CarCollectionEvent).Subscribe(AddressOf DisplayModule)

End Sub
CarWindowView ViewModel DisplayModule方法调用次数太多:

Public Sub DisplayModule(ByVal param As String)
If param = EditObject Then
  IsInEditMode = True
  ' Logic removed for display reasons here. This logic breaks because it's called too    many times.
  End If
End Sub

因此,我无法理解为什么EventAggregator只能存储一次单击,而不能存储编辑按钮上的所有单击。对不起,如果这不是很好地解释!谢谢你的帮助

听起来您的CarWindowViewModel内存泄漏了。换句话说,该类的多个实例尚未被垃圾收集。在调试器中,查看GetHashCode。我敢打赌他们是不同的

假设您使用的是Prism的EventAggregator,它应该保留对对象的弱引用,所以这不是您的问题


最可能的情况是,您需要确保完成ViewModel后,它将取消订阅该事件。另外,看看您是否能找出引用链中的哪些内容使它们保持活动状态。

听起来您的CarWindowViewModel内存泄漏了。换句话说,该类的多个实例尚未被垃圾收集。在调试器中,查看GetHashCode。我敢打赌他们是不同的

假设您使用的是Prism的EventAggregator,它应该保留对对象的弱引用,所以这不是您的问题

最可能的情况是,您需要确保完成ViewModel后,它将取消订阅该事件。另外,看看你是否能发现引用链中的内容是什么使他们活着。

< P>我认为EngestPiggor事件是那些你想要的任何旧视图或在其他模块中写入的视图模型来听或不听,就像他们希望的那样。如果我有两个视图,它们在操作上彼此非常依赖,并且它们总是位于同一个逻辑树中,那么我使用常规的旧.NET事件

这只是我认为适合EventAggregator的fire and forget类型的事件。我知道Prism包中的示例似乎提倡在更紧密耦合的主/细节场景中使用它们,但我并不认为这是恰当的阅读:overkill

<>虽然这并不能直接解决你的问题,但我的脑海中也有一个内存泄漏,如果你这样组织,你可能会完全避免这个问题。

< P>我认为EngestPiggor事件是那些你希望任何旧的视图或在其他模块中写入的视图模型来听或不听的。如果我有两个视图,它们在操作上彼此非常依赖,并且它们总是位于同一个逻辑树中,那么我使用常规的旧.NET事件

这只是我认为适合EventAggregator的fire and forget类型的事件。我知道Prism包中的示例似乎提倡在更紧密耦合的主/细节场景中使用它们,但我并不认为这是恰当的阅读:overkill


虽然这并不能直接解决您的问题,但我认为您也存在内存泄漏,如果您这样组织,可能会完全避免此问题。

您可能是正确的,我将进行调查。你是什么意思;在调试器中,查看GetHashCode-什么是GetHashCode,在调试期间如何查看它?另外,我在每次EditBtn单击时都运行这行代码:_Container.ResolveOf CarWindowViewModel会导致该行为吗?当您在类的某个方法的调试器中时,请在监视窗口中键入this.GetHashCode。它将为您的类提供唯一的ID。使用这个,您可以找到您正在查看的实例。一个类似的机制是将其添加到watch窗口并选择Make ID,它将提供一个更漂亮的ID来跟踪它。如果使用容器来解决VIEW模型,则可以考虑将其配置为单个生命周期。这样它只会被创建一次。寻找你在课堂上关注的事件。这是一个经常发生泄漏的地方,你说得对,布莱恩。取消订阅活动解决了我的问题。你很可能是对的,我会调查。你是什么意思;在调试器中,查看GetHashCode-什么是GetHashCode,在调试期间如何查看它?此外,我还在每个EditBtn单击上运行这行代码:_Container.ResolveOf CarWindowViewModel
这会导致该行为吗?当您在类的某个方法的调试器中时,请在“监视”窗口中键入this.GetHashCode。它将为您的类提供唯一的ID。使用这个,您可以找到您正在查看的实例。一个类似的机制是将其添加到watch窗口并选择Make ID,它将提供一个更漂亮的ID来跟踪它。如果使用容器来解决VIEW模型,则可以考虑将其配置为单个生命周期。这样它只会被创建一次。寻找你在课堂上关注的事件。这是一个经常发生泄漏的地方,你说得对,布莱恩。取消订阅活动解决了我的问题。