Pregunta

Tengo un escenario bastante simple que no puedo trabajar correctamente. Tengo 2 vistas, Carview y CarwindowView (ChildWindow) con modelos de vista correspondientes. En mi carvisión tengo un editButton que abre CarwindowView (ChildWindow) donde puedo editar los campos de objetos del automóvil.

Mi problema es que el método DisplayModule en mi ViewModel de CarwindowView se llame demasiadas veces ... Cuando presiono el botón Editar la primera vez que se llama una vez, la segunda vez que se llama Twince, la tercera vez se llama 3 veces y ¡Así que fuerte ...!

View ViewModel Constructor:

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 Método:

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 Constructor:

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 Método (este es el método que se llama demasiadas veces):

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

Por lo tanto, no puedo entender cómo solo puedo tener el EventAggregator para almacenar solo el único clic, y no todo mi clic en el botón Editar. ¡Lo siento si esto no está bien explicado! Ayuda apreciada !!

¿Fue útil?

Solución

Parece que tiene una fuga de memoria de CarwindowViewModel. En otras palabras, tiene múltiples instancias de esa clase que no se han recolectado basura. En el depurador, mire Gethashcode. Estoy dispuesto a apostar que son diferentes.

Suponiendo que esté utilizando el EventAggregator de Prism, se supone que debe mantener una referencia débil a su objeto, por lo que ese no es su problema.

Lo más probable es que deba asegurarse de que cuando se realice ese modelo ViewModel, se dé cuenta del evento. Además, vea si puede averiguar qué en la cadena de referencias los mantiene con vida.

Otros consejos

Yo considero EventAggregator Events para ser aquellos que desea cualquier vista antigua o ViewModel escrito en otros módulos para escuchar (o no, como quieran). En el caso de que tengo dos puntos de vista que dependen muy de la otra para operar y siempre Vive en el mismo árbol lógico, uso eventos regulares de .NET..

Es solo el El tipo de eventos "Fire and Forget" que siento que son apropiados para el EventAggregator. Sé que las muestras en el paquete de Prism parecen abogar por su uso en escenarios maestros/detallados más bien acoplados, pero realmente no creo que sea apropiado (léase: Overkill).

Aunque esto no aborda directamente su problema (tengo la mente de que también tiene una fuga de memoria), si lo organiza así, es probable que evite este problema por completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top