Создание «безликих» видов в MVVM - PullRequest
2 голосов
/ 25 апреля 2011

Мы хотели бы создать приложение, которое можно быстро и легко «перекрасить» с максимально возможной гибкостью.Обычно это достигается путем замены шаблонов и стилей в словаре ресурсов.

Пользовательские элементы управления в WPF разработаны так, чтобы они выглядели «безликими».Вся логика заложена в коде, шаблоны элементов управления в словарях используются для связи вида с элементом управления.

Между MVVM и пользовательскими элементами управления есть много общего.Многие разработчики говорят, что MVVM превосходит пользовательские элементы управления.И то, и другое можно рассматривать как методы перемещения логики из представления в другой файл кода.Я думаю, что между этими двумя понятиями может быть семантическое различие, если виртуальная машина содержит логику, связанную с доменом, тогда как пользовательские элементы управления содержат логику, специфичную для представления.

Каков наилучший метод для перемещения XAML соответствующего представления в словарь ресурсов, который может бытьпоменялось?Должен ли я использовать прямые шаблоны данных в словаре (не мой предпочтительный метод, потому что представления сложны)?Должен ли я создать собственный элемент управления для замены представления и определить для него шаблон элемента управления (в результате дублирующийся код между элементом управления и виртуальной машиной)?Должен ли я использовать UserControls для представлений и изолировать XAML для этих элементов управления, чтобы эти файлы могли быть заменены словарями ресурсов?

Как бы вы справились с этой проблемой?Какие-либо предложения?

Спасибо!

1 Ответ

2 голосов
/ 26 апреля 2011

Лично мне нравится использовать , используя IValueConverter, как этот пост.

Это в основном требует от вас:

  • Поместить одну запись в ваше приложениересурсы, требующие WPF, используют конвертер значений
  • Реализуйте IValueConverter с помощью пользовательской логики, которую вы хотите.

Это позволяет вам иметь такую ​​гибкость, которая вам необходима для вашего приложения.В приведенном выше посте используется соглашение о стратегии поиска конфигурации, но вы можете легко заменить его на конвертер, который использует сервис, который вы можете регистрировать / разрешать объекты следующим образом:

public static class ServiceProvider
{
  public void Register<TView>(Type ViewModelType);
  public void Register(IDictionary<Type,Type> ViewLookup);
  public object Resolve(object ViewModel);
}

HTH

...