MVVM Light Toolkit - RelayCommands, DelegateCommands и ObservableObjects
-
15-10-2019 - |
Вопрос
Я только начал экспериментировать с Лоурентом Багнионом MVVM Light Toolkit. Анкет Я думаю, что мне это действительно понравится, но у меня есть пара вопросов.
Прежде чем я доберусь до них, позвольте мне объяснить, откуда я. В настоящее время я использую комбинацию Джоша Смита MVVM Foundation и еще один проект на Codeplex под названием MVVM Toolkit. Анкет я использую ObservableObject
а также Messenger
из фонда MVVM и DelegateCommand
а также CommandReference
Из MVVM Toolkit.
Единственное реальное совпадение между MVVM Foundation и MVVM приняли. ICommand
: Фонд MVVM RelayCommand
и MVVM Takeit DelegateCommand
. Анкет Из этих двух, DelegateCommand
кажется более сложным. Он использует CommandManagerHelper
Это использует слабые ссылки, чтобы избежать утечек памяти.
С учетом сказанного, вот мои вопросы:
Почему используется свет MVVM
RelayCommand
скорее, чемDelegateCommand
? Использование слабых ссылок вICommand
ненуж или не рекомендуется по какой -то причине?Почему нет
ObservableObject
в свете MVVM?ObservableObject
в основном только частьViewModelBase
это реализуетINotifyPropertyChanged
, но очень удобно иметь в качестве отдельного класса, потому что модели видов-не единственные объекты, которые должны реализоватьINotifyPropertyChanged
. Анкет Например, допустим, у вас есть DataGrid, который связывается с спискомPerson
объекты. Если какое -либо из свойств вPerson
может измениться, пока пользователь просматривает DataGrid,Person
нужно будет реализоватьINotifyPropertyChanged
. Анкет (Я понимаю, что еслиPerson
Автоматическая сгенерирована с использованием чего-то вроде LinqtoSQL, он, вероятно, уже будет реализоватьINotifyPropertyChanged
, но есть случаи, когда мне нужно сделать специфические для представления версии объектов модели объекта, скажем, потому что мне нужно включить команду для поддержки столбца кнопки в DataGrid.)
Спасибо.
PS вот код для DelegateCommand
Из инструментария MVVM:
https://docs.google.com/document/pub?id=1APCX5SBCFHI5FBHV8KI3ZA6J34SP2T80LQZDJ89V8CU
Решение
Похоже, что проблема, поднятая первым вопросом, была решена в последней сборке:
Согласно с Сайт MVVM Light Toolkit Codeplex (под «поднятием события CanexeCeteChanged вручную»), CommandManager
был исключен вообще.
Что касается Observable Object
, Я добавил Предмет для трекера выпуска на сайте Codeplex.
Другие советы
Вы также можете рассмотреть CATEL. Анкет Он поддерживает DataObject (как универсальный, так и негенерический), который поддерживает именно то, что вы ищете (объект реализует inotifypropertychanged, idataerrorinfo и многое другое). Затем ViewModelbase получен из очень мощного класса DataBjectBase, поэтому вы можете использовать DataObjectBase для объектов данных и ViewModelBase для моделей просмотра.
Это также избавляет вас от создания мессенджеров, так как вы можете просто использовать атрибут «Заинтересованные» в модели представления для получения уведомлений о изменениях другой модели представления.
Оба ваших вопроса настоятельно подсказывают мне, что вы предпочитаете что -то использовать более чем концепция модели представления, чтобы определить бизнес -логику.
А DelegateCommand
определяет а отдельный класс, кроме модели вида. А ObservableObject
это экземпляр отдельный класс, кроме модели вида. Это не правило, а личное предпочтение момента: модель представления достаточна для меня как контейнера для бизнес -логики, относящейся к визуальным эффектам. Это может предложить мое предпочтение свету MVVM-который я не нахожу в данный момент.
Я не совсем уверен в том, что происходит в примере DataGrid. Я могу сказать, что DataGrid не очень гибкий-однако, в WPF, DataGridTemplateColumn
может декларативно связать модель представления с представлением (например, пользовательский контроль). Так что, возможно, это имеет смысл:
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataView="{x:Type m:YourViewModelForButton}">
<v:YourViewWithButton/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>