Я только начал экспериментировать с MVVM Light Toolkit Лорана Бюньона. Думаю, мне это действительно понравится, но у меня есть пара вопросов.
Прежде чем я перейду к ним, позвольте мне объяснить, откуда я. В настоящее время я использую комбинацию Джоша Смита MVVM Foundation и другого проекта на Codeplex под названием MVVM Toolkit . Я использую ObservableObject
и Messenger
из MVVM Foundation и DelegateCommand
и CommandReference
из MVVM Toolkit.
Единственное реальное перекрытие между MVVM Foundation и MVVM Tookit состоит в том, что они оба имеют реализацию для ICommand
: MVVM Foundation имеет RelayCommand
, а MVVM Tookit имеет DelegateCommand
. Из этих двух DelegateCommand
кажется более сложным. Он использует CommandManagerHelper
, который использует слабые ссылки, чтобы избежать утечек памяти.
С учетом сказанного, вот мои вопросы:
Почему MVVM Light использует RelayCommand
, а не ] DelegateCommand
? Является ли использование слабых ссылок в ICommand
ненужным или не рекомендуется по какой-то причине?
Почему нет ObservableObject
в MVVM Light? ObservableObject
- это, по сути, лишь часть ViewModelBase
, которая реализует INotifyPropertyChanged
, но его очень удобно иметь как отдельный класс, потому что модели представления - не единственные объекты, которые необходимо реализовать INotifyPropertyChanged
. Например, пусть ' s скажем, у вас есть DataGrid, который привязывается к списку объектов Person
. Если какое-либо из свойств в Person
может измениться, пока пользователь просматривает DataGrid, Person
должен будет реализовать INotifyPropertyChanged
. (Я понимаю, что если Person
автоматически сгенерирован с использованием чего-то вроде LinqToSql, он, вероятно, уже будет реализовывать INotifyPropertyChanged
, но есть случаи, когда мне нужно создать версии модели сущности для конкретных представлений объекты, например, потому что мне нужно включить команду для поддержки столбца кнопок в DataGrid.)
Спасибо.
PS Вот код для DelegateCommand
из MVVM Toolkit:
https://docs.google. com / document / pub? id = 1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU