Я пытаюсь понять, как правильно распоряжаться видами и режимами просмотра в среде mvvm. Я столкнулся с одной конкретной проблемой с различными пользовательскими элементами управления (которые по сути являются моими взглядами) и их соответствующими режимами просмотра в среде стыковки (аналогично тому, что вы можете увидеть в визуальной студии).Действительно ли мой ViewModel удаляется
Я читал бесчисленные сообщения, блоги и вопросы здесь и, наконец, нашел то, что, как я думал, работает (действительно, вполне возможно, но я просто не понимаю этот процесс).
В моей модели просмотра я реализую Idiposable и в представлении (которому он задан как его datacontext). Я гарантирую, что вызовы view будут располагаться в своем datacontext при его разгрузке. Таким образом, просмотр закрывается и вызывает dispose на свой datacontext (моя модель просмотра), гарантируя, что я могу очистить все оставшиеся блоки, которые могут зависать и вызывать утечку памяти, например обработчики событий.
Одним из таких ViewModel имеют следующий код в переопределен Dispose подразделов:
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
'
'
If mwvm.CanCallDisposeOnErsSubmissionViewModel Then
mwvm = Nothing
subEd = Nothing
retEd = Nothing
End If
' TODO: set large fields to null.
End If
Try
If Not mwvm.CanCallDisposeOnErsSubmissionViewModel Then
disposedValue = False
End If
Catch ex As NullReferenceException
disposedValue = True
End Try
MessageBox.Show("DisposeValue = " & disposedValue.tostring)
End Sub
Это ViewModel ссылка элементы в mainviewmodel заявки (одна из причин, почему я чувствовал, что это было важно, чтобы очистить его после того, как но представление, для которого это контекст данных, перерисовывается, если конечный пользователь либо добавляет, либо закрывает другие окна в док-станции, в которой он сидит (отсюда необходимость условного оператора).
Теперь это может быть не так элегантный, и, возможно, это не лучший способ сделать это, но мой вопрос возникает из наблюдения мычание.
Когда я решила активно закрыть представление, а условные операторы позволяют выполнить очистку и установить значение, равное true, я бы подумал, что это будет означать, что модель обзора была хорошо и по-настоящему закрыта и однако я могу позволить программе продолжать работать, и hey presto up выдает окно сообщения, которое может быть получено только от обработчика выше. Так ли моя модель должным образом отключена, это нормальное поведение (предположительно сборщик мусора, делающий свою вещь, чтобы его можно было игнорировать), или есть какая-то фундаментальная ошибка с моей стороны где-то?
Вы видели этот вопрос? Http: // StackOverflow.com/questions/3258064/what-best-practices-for-cleaning-up-event-обработчик-ссылки – netaholic
Как реализован ваш метод 'Dispose()' (один из интерфейса 'IDisposable', без параметров)? Он должен вызывать 'GC.SuppressFinalize (this);' после вызова 'Dispose (true)'. Это предотвратит вызов GC из Dispose() 'в фактическую сборку мусора (вы не можете контролировать, когда это произойдет, GC делает это). Проверьте MSDN для правильной реализации одноразового шаблона: https://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize(v=vs.110).aspx – Tseng
@Tseng Большой вызов, спасибо, это точно что я пропустил. Отметьте это как ответ, а не только так, чтобы я мог принять его, но также и как простой способ для любого, кто задается вопросом о том, чтобы определить его. –