Специально для этой проблемы
Самое простое решение этого конкретного случая - это добавление присоединенного свойства, которое его выполняет, или поведения.Поведение может быть серебряной пулей для большинства этих случаев, не поддерживаемых rich-gui в mvvm.
Что касается общего случая
ViewModel никогда не следует ни при каких условияхОбстоятельства знают о представлении, и даже не о IView.в MVVM это «всегда смотреть вверх», что означает, что View может смотреть на виртуальную машину, а VM может смотреть на модель.никогда наоборот.Это значительно улучшает удобство обслуживания, так как ViewModel делает не две вещи (заряд логики и графический интерфейс), а только одну вещь.Именно здесь MVVM превосходит любой предыдущий паттерн MV *.
Я бы также попытался воздержаться от использования View в сочетании с ViewModel.это создает уродливый код и разрушаемую зависимость между двумя классами, но иногда, как вы сказали, это более прагматично.Более красивый способ - отправить Свободное сообщение (например, Messenger в MVVMLight или EventAggregator в Prism) из ViewModel в View, и, таким образом, между ними нет сильной зависимости.Некоторые думают, что это лучше, хотя IMO это все еще зависимость.
В некоторых случаях написание кода в представлении - это нормально, и это может быть одной из таких ситуаций.Вы могли бы достичь идеального решения, используя присоединенное поведение, но принцип важен, как вы и просили.
MVVM проблематичен, когда вам нужен очень богатый графический интерфейс или пользовательский интерфейс не имеет нужных свойств для привязкик.В этих ситуациях вы должны прибегнуть к одной из трех вещей:
- Присоединенные поведения.
- Извлечение из существующих элементов управления и добавление свойств, которые вы хотите.
- На самом деленаписание кода в представлении.
Все эти способы являются законными, но я заказал их в соответствии с тем, к чему следует прибегнуть в первую очередь.
Подвести итог
Самая важная вещь, которую вы должны сохранить в MVVM, - это не оставлять код свободным, а хранить всю логику и данные в ViewModel, где представление должно содержать только код, связанный с View.Архитекторы советуют вам вообще не писать код только потому, что это скользкий путь.Вы начинаете писать что-то маленькое, и в итоге вы делаете логические вещи или поддерживаете состояние приложения в представлении, которое является большим нет-нет.
Happy MVVMing:)