MVVM практики: выставить класс viewmodel внутри элемента управления - PullRequest
0 голосов
/ 05 сентября 2018

Я отредактировал вопрос, чтобы сделать то, что я хочу получить, более понятным. Вот оригинальный вопрос:

Я работаю над классом, который наследуется от Control, который будет использоваться в моем представлении и включает некоторые свойства зависимости.
Один из этих DP - IEnumerable(Of RfidTag) и будет связан с ObservableCollection(Of RfidTag) внутри виртуальной машины. Класс RfidTag определяется как открытый класс в том же файле, в котором находится класс виртуальной машины.

Вопросы:

1. Является ли хорошей практикой выставлять связанный с VM класс классу Control?
2. Является ли исходный файл виртуальной машины хорошим местом для класса RfidTag?

ОБНОВЛЕНИЕ 1
В моей логике приложения (я думаю, я мог бы сказать, что в моей модели) есть событие, опубликованное через Eventaggregator. Полезная нагрузка события - это список ModelRfidTag (это класс модели).
Моя ВМ подписывается на это событие, и я создал класс RfidTag, чтобы обернуть свой класс Model, и предоставляет некоторые дополнительные свойства, относящиеся только к ВМ.

Когда выполняется обработчик событий внутри виртуальной машины, ObservableCollection(Of RfidTag) связывается из представления.
Затем в представлении я получил несколько таких контрольных экземпляров

<c:RfidTagPresenter 
TagPosition="1"
Collection="{Binding RfidTagList, Mode=OneWay}" />

Затем в моем RfidTagPresenter (классе, который наследуется от Control) у меня есть DP типа RfidTag (называемый RfidTagResult), который возвращает объект в OC, который имеет свойство Position (свойство доступно внутри класса RfidTag), равного значению, установленному TagPosition DP. Таким образом, ControlTemplate RfidTagPresenter может привязывать свои элементы к нужному объекту.

Это упрощение того, что я хочу сделать. В реальном приложении есть некоторые другие DP, для которых выполняется выбор RfidTagResult

ОБНОВЛЕНИЕ 2
После небольшого исследования кажется, что я могу решить одну проблему с помощью индексированного свойства, которое возвращает (в методе get) объект из коллекции, которую я хочу связать. Однако проблема все еще существует: мой элемент управления должен иметь DP типа RfidTag, чтобы относительный ControlTemplate мог связываться со свойством, объявленным в классе RfidTag. Итак: возможно ли (читай: хорошая практика) иметь DP типа, который относится к классу, связанному с VM? Другими словами: может ли пользовательский элемент управления знать тип класса, используемый виртуальной машиной?

1 Ответ

0 голосов
/ 06 сентября 2018

Я постараюсь обойти весь ваш вопрос (если я что-то упустил, дайте мне знать), но сначала вы должны объяснить цель связывания Collection в элементе управления как DP.

Хорошая ли практика выставлять связанный с VM класс классу Control?

RfidTag, я полагаю, это Model. То, что вы действительно делаете здесь, это привязывает Model в вашем контроле, который идет вразрез с шаблоном MVVM. Вы должны подумать о следующем вопросе ... Вам действительно нужно, чтобы все ваши RfidTag были показаны в View? Если вам нужно показать имя, ID ... вы можете просто создать IEnumerable<string> как DP (что правильно), а затем в вашем VM вместо ObservableCollection<RfidTag> у вас будет ObservableCollection<string>.

Некоторая простая теория. В MVVM, VM адаптирует Model к View. Таким образом, ваш VM должен иметь все, что будет отображаться в вашем View.

является ли исходный файл виртуальной машины хорошим местом для класса RfidTag?

RfidTag - это Model, так что лучшего места для этого нет:)

...