質問

正しく仕事をすることができない非常に簡単なシナリオがあります。対応する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)。

これはあなたの問題に直接対処するわけではありませんが(私はあなたもメモリリークがあるという心です)、このように整理すると、この問題を完全に回避するでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top