1

正しく動作することができない非常に単純なシナリオがあります。CarViewとCarWindowView(子ウィンドウ)の2つのビューがあり、対応するViewModelがあります。私のCarViewには、Carオブジェクトフィールドを編集できるCarWindowView(子ウィンドウ)を開くEditButtonがあります。

私の問題は、CarWindowView ViewModelのDisplayModuleメソッドが何度も呼び出されていることです...最初に編集ボタンを押すと、1回呼び出され、2回目はtwineと呼ばれ、3回目は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で、[編集]ボタンのすべてのクリックではなく、1回のクリックだけを保存する方法を理解できません。これがうまく説明されていない場合は申し訳ありません!感謝します!

4

2 に答える 2

4

CarWindowViewModelのメモリリークがあるようです。つまり、ガベージコレクションされていないそのクラスのインスタンスが複数あります。デバッガーで、GetHashCodeを確認します。私はそれらが異なっていることに賭けても構わないと思っています。

PrismのEventAggregatorを使用していると仮定すると、オブジェクトへの弱参照を保持することになっているため、問題はありません。

ほとんどの場合、そのViewModelが実行されたときに、イベントのサブスクライブを解除することを確認する必要があります。また、参照チェーンの何がそれらを存続させているのかを理解できるかどうかを確認してください。

于 2010-06-03T10:16:44.767 に答える
1

EventAggregatorイベントは、他のモジュールで記述された古いビューまたはビューモデルでリッスンする(またはリッスンしない)イベントであると考えています。動作するために相互に非常に依存している2つのビューがあり、それらが常に同じ論理ツリーに存在する場合、通常の古い.NETイベントを使用します

EventAggregatorに適していると私が感じるのは、 「ファイアアンドフォーゲット」タイプのイベントだけです。Prismパッケージのサンプルは、より緊密に結合されたマスター/詳細シナリオでの使用を推奨しているように見えますが、実際には適切ではないと思います(読み取り:やり過ぎ)。

これは問題に直接対処するものではありませんが(メモリリークもあると思います)、このように整理すると、この問題を完全に回避できる可能性があります。

于 2010-06-03T16:39:48.517 に答える