Изменение вида для ViewModel

Я пытаюсь реализовать проект MVVM для приложения mt WPF. Чтобы подключить представление к режимам просмотра, я использую ResourceDictionary (используемый в Application.Resources ), который выглядит как

    

Модели представления затем просто помещаются в презентаторы содержимого для их отображения.

Теперь, когда пользователь нажимает кнопку, я хотел бы отобразить SampleViewModel используя другое представление. Как изменить шаблон данных, используемый для SampleViewModel ?

Меньше слов больше кода. Насколько вы сказали, у вас есть class SampleViewModel . Я добавил свойство Title для демонстрации и ViewType для определения правильного вида:

 public enum ItemViewType { View1, View2 }; public class SampleViewModel { public string Title { get; set; } public ItemViewType ViewType { get; set; } } 

DataTemplateSelector для двух видов в зависимости от свойства ViewType :

 class ItemViewTemplateSelector : DataTemplateSelector { public DataTemplate View1Template { get; set; } public DataTemplate View2Template { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var vm = item as SampleViewModel; if (vm == null) return null; switch (vm.ViewType) { case ItemViewType.View1: return View1Template; case ItemViewType.View2: return View2Template; } return null; } } 

Код Xaml:

                 

Основная часть находится в classе MainViewModel где я поставил логику переключения видов:

 public class MainViewModel : ViewModelBase { public MainViewModel() { this.ItemViewModel = new SampleViewModel { Title = "Some title", ViewType = ItemViewType.View1 }; this.SwitchViewCommand = new RelayCommand(() => { this.ItemViewModel.ViewType = this.ItemViewModel.ViewType == ItemViewType.View1 ? ItemViewType.View2 : ItemViewType.View1; //The magic senquence of actions which forces a contentcontrol to change the content template var copy = this.ItemViewModel; this.ItemViewModel = null; this.ItemViewModel = copy; }); } public RelayCommand SwitchViewCommand { get; set; } private SampleViewModel itemViewModel; public SampleViewModel ItemViewModel { get { return itemViewModel; } set { itemViewModel = value; RaisePropertyChanged("ItemViewModel"); } } } 

SwitchViewCommand может быть любой командой, я использую команду из библиотеки mvvmlight.

Внутри обработчика команды я изменяю тип viewmodel и изменяю свойство ItemViewModel непростым способом, потому что ContentControl обновляет представление только в том случае, если изменить свойство Content, и это свойство не будет изменено, если вы не установите ссылку на другой объект ,

Я имею в виду, даже код this.ItemViewModel = this.itemViewModel не изменит представление. Это странно, но обходной путь не требует много работы.

Вы можете достичь этого по-разному, зависит от архитектуры, которую вы хотите.

  • Вы можете написать собственный DataTemplateSelector и использовать его в ContentControl.ContentTemplateSelector и правильно выбрать эти два шаблона
  • Если этот шаблон изменения представления происходит во многих разных местах и ​​более частый UX, я бы также рекомендовал эти два представления переключиться с использованием DataTemplate.DataTrigger на основе свойства в SampleViewModel [я предполагаю, что у вас может быть отличительное свойство в ViewModel для знать это состояние]

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

  • WPF Get Element (s) под мышью
  • MVVM Light & WPF - привязка Несколько экземпляров windows для ViewModel
  • WPF: привязать DataGrid к списку
  • Загрузка XAML во время выполнения?
  • Установите элемент управления веб-браузером WPF для использования режима IE10
  • Привязать к методу в WPF?
  • Установка свойства Style метки WPF в коде?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Динамический шаблон изменения данных
  • Перетаскивание из источника данных в окно WPF не работает
  • BitmapImage в WPF блокирует файл
  • Interesting Posts

    есть ли css-хак для safari только НЕ хром?

    Экран Blackout / Flicker для ноутбука; Прекрасно работает на внешнем мониторе

    Java regex для поддержки Unicode?

    О том, как распознать ссылку Rvalue или Lvalue и правило if-it-have-a-name

    Получить значение динамического свойства c # через строку

    Как отключить и включить порт USB через командную строку?

    Поддерживает ли Scala оптимизацию хвостовой рекурсии?

    Установите масштаб отображения при использовании удаленного рабочего стола с Surface Pro

    Почему в Java-коде не используется PipedInputStream / PipedOutputStream?

    Не удалось конвертировать в формат Dalvik: невозможно выполнить dex: Java heap space

    Перегруженный аргумент группы методов смущает разрешение перегрузки?

    jQuery’s .click – передать параметры пользователю

    Реализация HMAC-SHA1 в python

    Excel: как навсегда применить условное форматирование ко всей электронной таблице?

    Как изменить имя рецензента в Word?

    Давайте будем гением компьютера.