我有一个很简单的情况,我无法正常工作。我有2个视图,CarView和CarWindowView(childwindow)以及相应的ViewModels。在我的CarView中,我有一个EditButton,它可以打开CarWindowView(childwindow),我可以在其中编辑Car对象字段。我可以删除EventAggregator中的重复事件吗?
我的问题是我的CarWindowView ViewModel中的DisplayModule方法被调用了太多次...当我第一次按下编辑按钮时,它被调用一次,第二次它被调用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
Carview会视图模型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视图模型构造:
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视图模型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存储只有一个单一的点击,而不是我所有的点击编辑按钮。对不起,如果这不是很好解释!帮助赞赏!
你可能很对,我会调查。 你是什么意思; “在调试器中,看看GetHashCode” - 什么是GetHashCode,在调试过程中我怎么看? 另外我在每个EditBtn点击运行这行代码:_Container.Resolve(的CarWindowViewModel)() 这可能导致行为? – Mcad001 2010-06-03 11:05:35
当您在该类的某个方法的调试器中时,在监视窗口中输入this.GetHashCode()。它会为你的班级提供一个唯一的ID。使用这个,你可以找出你正在查看哪个实例。一个类似的机制是将其添加到监视窗口并选择“Make ID”,并且它会给它一个更加漂亮的ID来跟踪它。 如果您使用容器来解析ViewModel,则可以考虑将其配置为单个生命周期......这种方式只能创建一次。 寻找你在课堂上所吸引的事件。这是泄漏的常见地点。 – 2010-06-03 13:18:53
你是对的Brian。 取消订阅活动解决了我的问题。 – Mcad001 2010-06-08 09:45:48