EventAgggregatorの複製イベントを削除できますか?
-
23-10-2019 - |
質問
正しく仕事をすることができない非常に簡単なシナリオがあります。対応するViewModelを持つCarviewとCarwindowview(ChildWindow)の2つのビューがあります。 Carviewには、CarWindowView(ChildWindow)を開く編集Buttonがあり、Car Objectフィールドを編集できます。
私の問題は、carwindowview viewmodelのdisplaymoduleメソッドが何度も呼ばれすぎていることです...編集ボタンを初めてプッシュすると、1回呼び出されたとき、2回目はTwinceと呼ばれます。だからフォート...!
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
したがって、編集ボタンをクリックするわけではなく、1回のクリックだけを保存するためにEventAgggregatorを使用できる方法を理解できません。これがよく説明されていない場合は申し訳ありません!感謝します!!
解決
CarwindowViewModelのメモリリークがあるように聞こえます。言い換えれば、ゴミ収集されていないクラスの複数のインスタンスがあります。デバッガーでは、GethashCodeをご覧ください。私は彼らが違うことを喜んでいます。
Prismのeventaggregatorを使用していると仮定すると、オブジェクトへの弱い参照を保持することになっているので、それはあなたの問題ではありません。
おそらく、そのviewmodelが完了したときに、イベントから登録されていないことを確認する必要があります。また、参照チェーンの内容を生かし続けているものを把握できるかどうかを確認してください。
他のヒント
私が検討します EventAgggregatorイベントは、他のモジュールに書かれた古いビューやViewModelを聴くために必要なイベントになります (またはそうでない、彼らが好きなように)。私が動作するためにお互いに非常に依存している2つのビューがある場合、それらは常に 同じ論理ツリーに住んでいる、私は通常の古い.NETイベントを使用しています.
それだけです 私がEventAgggregatorに適していると感じる「火と忘れる」タイプのイベント. 。 Prismパッケージのサンプルは、より緊密に結合されたマスター/ディテールシナリオでの使用を提唱しているように見えることを知っていますが、私はそれが適切ではないとは思いません(読む:Overkill)。
これはあなたの問題に直接対処するわけではありませんが(私はあなたもメモリリークがあるという心です)、このように整理すると、この問題を完全に回避するでしょう。