Обновление
В духе вики StackOverflow, вот обновление:
Я добавил предложение IValueConverter Джо Уайта ниже. Отлично работает.
Я написал «быстрый старт» этого примера, который автоматизирует отображение ViewModels-> Views с использованием некоторой дешевой замены строки. Если не найден View, представляющий ViewModel, по умолчанию используется страница «В разработке». Я называю этот подход "WPF MVVM White", так как это была идея Джо Уайта. Вот пара скриншотов.
Первое изображение - это случай, когда «[SomeControlName] ViewModel» имеет соответствующий «[SomeControlName] View», основанный на соглашении о чистых именах . Второй случай, когда ModelView не имеет никаких представлений для его представления. Нет больше ResourceDictionaries с длинными ViewModel для отображения отображений. Теперь это соглашение по именованию.
Я разместил загрузку проекта здесь:
Mvvm.White.Quickstart.zip
Исходное сообщение
В выходные я прочитал фантастическую статью MSDN Джоша Смита о WPF MVVM. Это суждено стать культовой классикой.
Мне потребовалось некоторое время, чтобы обернуться вокруг магии - попросить WPF визуализировать ViewModel .
Это все равно, что сказать: «Вот класс, WPF. Пойди выясни, какой интерфейс использовать для его представления».
Для тех, кто пропустил это волшебство, WPF может сделать это, просмотрев View для ModelView в сопоставлении ResourceDictionary и вытянув соответствующий View . (Прокрутите вниз до . Рисунок 10. Предоставление представления ).
Первое, что сразу бросается в глаза, это то, что уже существует строгое соглашение об именах:
classNameView ("View" suffix)
classNameViewModel ("ViewModel" suffix)
Мой вопрос:
Поскольку ResourceDictionary можно манипулировать программно, мне интересно, удалось ли кому-нибудь выполнить регулярное выражение Regex. Замените все это, , чтобы поиск выполнялся автоматически , и любой новый вид / ViewModels разрешаются в соответствии с соглашением об именах?
[Редактировать] Я представляю себе ловушку / перехват в ResourceDictionary.
... Также рассматривается метод при запуске, который использует взаимодействие для извлечения имен классов *View$
и *ViewModel$
для построения словаря DataTemplate в коде:
//build list
foreach ....
String.Format("<DataTemplate DataType=\"{x:Type vm:{0} }\"><v:{1} /></DataTemplate>", ...)