1

我有一个非常简单的场景,我无法正常工作。我有 2 个视图,即 CarView 和 CarWindowView(子窗口)以及相应的 ViewModel。在我的 CarView 中,我有一个 EditButton 可以打开 CarWindowView(子窗口),我可以在其中编辑 Car 对象字段。

我的问题是我的 CarWindowView ViewModel 中的 DisplayModule 方法被调用了太多次......当我第一次按下编辑按钮时,它被调用一次,第二次被调用两次,第三次被调用 3 次和如此堡垒……!

CarView ViewModel 构造函数:

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

CarView ViewModel HandleEditCarBtnClick 方法:

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 ViewModel 构造函数:

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 只存储一次单击,而不是我对“编辑”按钮的所有单击。对不起,如果这不是很好的解释!帮助赞赏!

4

2 回答 2

4

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

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

最有可能的是,您需要确保该 ViewModel 完成后,它会取消订阅该事件。另外,看看你是否能弄清楚参考链中的什么让它们保持活力。

于 2010-06-03T10:16:44.767 回答
1

我认为EventAggregator 事件是您希望在其他模块中编写的任何旧视图或视图模型可以收听的那些(或不收听,随意)。如果我有两个非常依赖于彼此操作的视图并且它们总是存在于同一个逻辑树中,我使用常规的旧 .NET 事件

这只是我认为适合 EventAggregator 的“即发即弃”类型的事件。我知道 Prism 包中的示例似乎提倡在更紧密耦合的主/细节场景中使用它们,但我认为这并不合适(阅读:矫枉过正)。

尽管这不能直接解决您的问题(我认为您也有内存泄漏),但如果您像这样组织它,您可能会完全避免这个问题。

于 2010-06-03T16:39:48.517 回答