我有一個很簡單的情況,我無法正常工作。我有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