#c# #wpf #mvvm #binding #weak-references
#c# #wpf #mvvm #привязка #слабые ссылки
Вопрос:
Я хотел бы подтвердить свое предположение.
Итак, у меня есть класс с именем, скажем, ViewModelProvider.
ViewModelProvider является одноэлементным и имеет
IDictionary<string, WeakReference<ViewModelType>>
ViewModelType реализует INotifyPropertyChanged .
По сути, ViewModelProvider просто создает экземпляры ViewModelType и передает их, если он уже существует, он передает тот же экземпляр.
Потребители этих экземпляров ViewModelType просто отображают их, связывая их следующим образом:
<ContentPresenter Content="{Binding VMInstance}" />
Экземпляры представлений создаются с использованием типизированных таблиц данных.
Со всем этим покончено.
Когда ViewModel привязан к данным, на его экземпляр неявно ссылается платформа WPF, подписывающаяся на обработчик PropertyChanged из INotifyPropertyChanged .
В течение этого времени, если я правильно понимаю, экземпляр ViewModelType удерживается как WeakReference, так и привязкой WPF. Правильно ли это?
Когда представление выгружается или уничтожается, в результате чего обработчик событий PropertyChanged не получает подписки, экземпляр ViewModelType теперь хранится ТОЛЬКО в WeakReference, что означает, что он может быть собран в любой момент времени с помощью GC, правильно ли это?
Каждый раз, когда кто-то запрашивает определенный ключ ViewModelType, мне нужно будет проверить, собран ли экземпляр, на который ссылается WeakReference, или нет, перед повторной инициализацией и передачей его обратно, это правильно?
Также кто-нибудь видит какие-либо проблемы с этим способом установки механизма кэша модели представления.
Спасибо.
Комментарии:
1. Использовали ли вы какой-либо контейнер DI в своем приложении? Почему вы не хотите передавать это задание о хранении ссылок и создании экземпляра в контейнер DI? Что, если вам нужно создать несколько разных представлений для одной и той же виртуальной машины? Что, если вы захотите получить несколько экземпляров виртуальной машины для одного и того же типа?