У меня проблема в приложении WPF с MvvmLight.
Мое приложение:
- У меня есть MainView с меню, каждый MenuItem открывается новый вид (различный для каждого элемента меню).
- Каждый MenuItem привязан к RelayCommand моей MainViewModel
- В моей MainViewModel RelayCommand просто делает
Messenger.Default.Send(this, "ShowMyView")
для MainView. - В моем MainView я зарегистрирован в сообщении «ShowMyView» и выполняются следующие действия:
var v = new MyView();
v.Owner = this;
v.ShowDialog();
Messenger.Default.Unregister(v);
Этот новый вид (MyView) привязан к модели представления (MyViewModel), который содержит свойства. Элементы этого представления (текстовое поле, radiobutton и т. Д. c) связаны с этими свойствами.
Когда я закрываю «MyView», он удаляется, и я возвращаюсь к своему основному виду, но «MyViewModel» все еще существует.
Проблема:
Когда я впервые открываю «MyView», привязка работает правильно, если «MyViewModel» устанавливает свойство, вызывается RaisePropertyChanged, затем «get» этого свойства вызывается один раз.
Но если я открываю и закрываю свое представление 20 раз, то в 20-й раз, когда вызывается RaisePropertyChanged, получение этого свойства вызывается 20 раз!
Вопрос:
Так как я могу отменить подписку на эти "RaisePropertyChanged", когда я закрываю представление?
Прыжки для вас понятны, и извините за мой плохой английский sh.
РЕДАКТИРОВАТЬ: С кодом
РЕДАКТИРОВАТЬ BIS
Вместо того, чтобы вводить некоторую часть кода, пожалуйста, найдете на моем github полный проект, где возникла проблема.
https://github.com/damgot/MvvmLightProblemExample
Когда я запускаю приложение, запускается MainWindow:
Вы можете увидеть в выводе отладки:
Starting
Creating NewViewModel
Затем, когда я нажимаю на NewView Menu, открывается новое представление:
И вы можете увидеть в выводе отладки:
Initialize NewViewModel and set MyBool to true
MyBool Set call + RaiseProperty
MyBool Get call
MyBool Get call
Кажется, хорошо, поскольку у меня есть 2 переключателя, привязанные к «MyBool»
Теперь, если я выберу «MyBool is false», переключатель:
и в выводе:
MyBool Set call + RaiseProperty
MyBool Get call
MyBool Get call
Все еще хорошо.
Теперь, если я закрою NewView, открою его снова и выберу кнопку «MyBool is false», вывод:
MyBool Set call + RaiseProperty
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
Затем снова вывод:
MyBool Set call + RaiseProperty
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
и еще раз:
MyBool Set call + RaiseProperty
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
MyBool Get call
И так далее ...
Как видите, вызов "Получить" для моей собственности, увеличивайте каждую команду, я снова открываю представление