Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 01.09.2014
Сообщений: 54

MVVM Light и очистка ресурсов

31.07.2015, 19:01. Показов 3059. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вопрос в том, как очистить ресурсы в MVVM Light (уничтожить ViewModel). Гугл утверждает, что нужно использовать SimpleIoc.Default.Unregister<ViewModel>. Но ресурсы таким вот образом не очищаются. Причем совсем. Например, если из MainViewModel сделать SimpleIoc.Default.Unregister<MainViewMod el>, то все волшебным образом продолжает работать )). Как сделать нормальный Dispose с физическим уничтожением экземпляра ViewModel?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2015, 19:01
Ответы с готовыми решениями:

Messanger MVVM Light
Здравствуйте! Разбираюсь с MVVM Light. Никак не могу настроить передачу сообщений из одной ViewModel в другую, помогите. ViewModel -...

MVVM Light периодически отваливается
Нормально работает, компилится, а потом разе например на 10-м бабах и Error CS0012 The type 'Object' is defined in an assembly that...

Mvvm Light. EventToCommand не срабатывает
Всё работает. кроме этой команды, то есть вью с вью моделью связаны точно правильно &lt;Menu&gt; &lt;MenuItem...

8
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
01.08.2015, 12:49
Попробуйте так:
C#
1
2
((IDisposable)ServiceLocator.Current.GetInstance<MainViewModel>()).Dispose();
SimpleIoc.Default.Unregister<MainViewModel>();
0
4 / 4 / 1
Регистрация: 01.09.2014
Сообщений: 54
01.08.2015, 14:11  [ТС]
kenny69, В MVVM Light не реализован интерфейс IDisposable, поэтому это не работает. Нужно изменять ViewModelBase.
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
01.08.2015, 14:33
Цитата Сообщение от Demo_Dem Посмотреть сообщение
В MVVM Light не реализован интерфейс IDisposable
Действительно так.
Вот что пишет разработчик по этому поводу:
The issue is historical. At first I thought it would be a good idea to force all VMs to be IDisposable. However, IDisposable has a different intent: Once the VM is Disposed, it is expected (by convention) that it will be garbage collected as soon as possible. After talking to friends, I realize that forcing all VMs to be IDisposable was a mistake. This is why I replaced IDisposable by ICleanup. The intent of ICleanup is to provide a way to clean VMs (for example flushing their state to persistent storage, closing streams etc...) but not necessarily in a way that they will be garbage collected as soon as possible.

Nothing prevents you to make your VMs implement IDisposable. I just didn't want to keep this constraint in the ViewModelBase class, which is why this interface will be removed in V4.

The benefit of having ICleanup is that you can clean all your VMs in one call of ViewModelLocator.Cleanup(). It is a hint to VM developers saying that VMs should think of providing a cleanup method for their VMs.
0
4 / 4 / 1
Регистрация: 01.09.2014
Сообщений: 54
01.08.2015, 14:53  [ТС]
kenny69, спасибо. Да, я уже читал это. И в общем то интерфейс ICleanup тоже вполне пригоден в некоторых случаях. Но ИМХО все таки должен быть способ полной очистки ресурсов. Не хорошо это, когда мусор после работы остается. Поэтому на днях займусь изменением ViewModelBase.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.08.2015, 17:49
Цитата Сообщение от Demo_Dem Посмотреть сообщение
Но ресурсы таким вот образом не очищаются.
А о каких ресурсах речь?

Добавлено через 1 минуту
Может на MainViewModel просто что-то ссылается?

Добавлено через 56 секунд
Если на него ссылается View (прибиндена вью модель к DataContext), то собственно должно быть понятно почему всё продолжает работать.
0
4 / 4 / 1
Регистрация: 01.09.2014
Сообщений: 54
01.08.2015, 17:59  [ТС]
Casper-SC, я создавал новую ViewModel, к которой ничего не прибиндено и делал ее CleanUp. А потом из кода прибиндивал к ней View и DataGrid к ObservableCollection. И данные в коллекции после SimpleIoc.Default.Unregister<MainViewMod el> оставались.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.08.2015, 19:57
Цитата Сообщение от Demo_Dem Посмотреть сообщение
SimpleIoc.Default.Unregister<MainViewMod el> оставались.
А с чего ты взял, что они там не должны оставаться?

Добавлено через 22 секунды
Поставь решарпер, жми F12 и смотри декомпилированные исходники.

Добавлено через 29 секунд
Ну или скачай исходники с гитхаба (или где там лежат они ща) и смотри, что делается при вызове этого метода.
Миниатюры
MVVM Light и очистка ресурсов   MVVM Light и очистка ресурсов  
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.08.2015, 20:13
Видишь на скриншоте MessengerInstance? Так вот это тот самый мессенджер, который позволяет слать сообщения, а в каких-то участках кода на них подписываться. И Unregister просто отписывается.

Добавлено через 3 минуты
Чтобы сборщик мусора удалил ViewModel нужно удалить все ссылки на неё. А у тебя на неё ссылается View (как я понимаю свойство DataContext ссылается на ViewModel. Ты ещё удивляешься, что всё продолжает работать как ни в чём не бывало и не зная описанных выше вещей собрался что-то там переписывать во ViewModelBase.

Добавлено через 50 секунд
Цитата Сообщение от Demo_Dem Посмотреть сообщение
Нужно изменять ViewModelBase.
Ничего там для этих целей изменять не нужно, эту библиотеку не дурак писал.

Добавлено через 3 минуты
Ещё не известно как ты используешь команды и используешь ли ты классы из библиотеки, а не свои самописные. В классах библиотеки используются слабые ссылки.

Добавлено через 1 минуту
Цитата Сообщение от Casper-SC Посмотреть сообщение
А с чего ты взял, что они там не должны оставаться?
Тьфу блин, я перепутал, я думал ты про Cleanup говоришь.

Добавлено через 1 минуту
Цитата Сообщение от Demo_Dem Посмотреть сообщение
Casper-SC, я создавал новую ViewModel, к которой ничего не прибиндено и делал ее CleanUp. А потом из кода прибиндивал к ней View и DataGrid к ObservableCollection. И данные в коллекции после SimpleIoc.Default.Unregister<MainViewMod el> оставались.
Да это всего лишь удаление из IoC контейнера. Ну удалил ты оттуда и что, окно один раз обратилось к этому контейнеру, получило ссылку на вью модель и всё.

Добавлено через 24 секунды
Ты удалил ссылку из контенера, но на вью модель ещё указывает, как минимум, окно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2015, 20:13
Помогаю со студенческими работами здесь

MVVM Light и оповещения об изменениях модели
В общем есть модель private int _id; private int _contrId; private double _course; public int Id...

MVVM Light генерация контролла пользователем
Здравствуйте. Стоит задача сделать так чтобы при клике на &quot;+&quot; добавлялась группа элементов (2 TimePiker (Использую WPF Toolkit)) . ...

Правильная структура проекта C# MVVM Light с DialogService
Здравствуйте. Где нужно правильно размещать файлы относящиеся к диалогам? Сейчас у меня DialogService.cs , DialogView.xaml лежат в общей...

Реализация команд в wpf на mvvm light toolkit
Здравствуйте. Подскажите, пожалуйста, как можно реализовать команды в wpf на mvvm light toolkit? Желательно с примерами кода или...

Как в MVVM Light установить шаблоны проектов?
После установки GalaSoft.MvvmLight.4.1.24.0.msi в 2012 студии нет шаблонов проектов. Как их поставить? В: &quot;Сервис&quot; -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru