Вопрос

Я только начал экспериментировать с Лоурентом Багнионом 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 Это использует слабые ссылки, чтобы избежать утечек памяти.

С учетом сказанного, вот мои вопросы:

  1. Почему используется свет MVVM RelayCommand скорее, чем DelegateCommand? Использование слабых ссылок в ICommand ненуж или не рекомендуется по какой -то причине?

  2. Почему нет 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top