WPF MVVM Зачем использовать ContentControl + DataTemplate Views, а не прямые XAML Window Views?

У меня вопрос о MVVM в WPF, который меня заводит.

Зачем что-то подобное 😕

MainWindow.xaml:

     

Создайте ваш ExampleView.xaml как:

        

И создайте окно следующим образом:

 public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); MainWindow app = new MainWindow(); ExampleVM context = new ExampleVM(); app.DataContext = context; app.Show(); } } 

Когда вы можете сделать это так 😕

App.xaml: (Установить начальное окно / View)

   

ExampleView.xaml: (a Window not the ResourceDictionary)

  >        

По существу это «View as DataTemplate» (VaD) против «View as Window» (VaW)

Вот мое понимание сравнения: (Примечание: я использую VS 2008, поэтому мне не хватает Blendability & / или другого материала)

  • VaD: позволяет переключать виды, не закрывая окно. (Это нежелательно для моего проекта)
  • VaD: VM ничего не знает о представлении, тогда как в VaW он (только) должен иметь возможность создавать экземпляр при открытии другого windows
  • VaW: Я действительно могу видеть, что мой xaml отображается в Дизайнере (я не могу с VaD, по крайней мере, в моей текущей настройке)
  • VaW: работает интуитивно с открытием и закрытием окон; каждое окно имеет (есть) соответствующий View (и ViewModel)
  • VaD: ViewModel может передавать начальную ширину windows, высоту, изменчивость и т. Д. Через свойства (тогда как в VaW они непосредственно устанавливаются в окне)
  • VaW: Можно установить FocusManager.FocusedElement (не уверен, как в VaD)
  • VaW: меньше файлов, так как мои типы окон (например, Ribbon, Dialog) включены в их представления

Так что здесь происходит? Не могу ли я просто создать свои windows в XAML, получить доступ к их данным по свойствам виртуальной машины и сделать с ними? Кодировка – то же самое (фактически ноль). Я пытаюсь понять, почему я должен перетасовать все материалы View в ResourceDictionary. (Но я не хочу делать это неправильно ;-))


Это даже имеет значение? Есть что-то, что я пропустил? Большое спасибо за чтение. : O


Благодаря Рейчел Лим и Нику Поляку за мое расцветное понимание MVVM

Изменить: незначительное изменение streamа

Люди используют DataTemplates таким образом, когда они хотят динамически переключать Views в зависимости от ViewModel:

            

Так,

если Window.DataContext является экземпляром VM1 , тогда будет отображаться View1 ,

и если

Window.DataContext – это экземпляр VM2 , после чего View2 .

Конечно, это не имеет никакого смысла, если ожидается только 1 вид, и он никогда не менялся.

Надеюсь, это достаточно ясно: P

Поскольку в VaD модели представления ничего не знают о представлениях, вы можете создать полностью функционирующее приложение, полностью состоящее только из моделей просмотра и без представлений. Это приводит к возможности написания приложения, которое может полностью управляться кодом. Это, в свою очередь, приводит к возможности проведения интеграционного тестирования без GUI. Интеграционное тестирование через графический интерфейс, как известно, является хрупким, а тестирование через модели просмотра должно быть более надежным.

Из моего личного опыта: обе модели работы – это рекламные материалы, в зависимости от того, что вы хотите, и в зависимости от требований приложения. Идея VaD заключается в расширении содержимого и контейнера. Если вы реализуете VaD вы можете использовать этот шаблон (по умолчанию), когда вы показываете любой элемент этого типа. Вы можете использовать его в ItemsControls (списки, списки, сетки и т. Д.), А в ContentControls только привязки. Как вы сказали, VaD работает для переключения содержимого windows с закрытием и открытием нового. Также вы можете определить представление с помощью UserControls , затем вы возьмете управление, если сфокусированы элементы, а также сможете управлять кодом позади. Таким образом, ваш шаблон данных может выглядеть следующим образом:

     

Вы также в UserControl можете устанавливать свойства зависимостей, что упрощает работу, поскольку позволяет привязывать и развязывать приложение.

Но, конечно, если приложение не требует динамического переключения контента, отлично использовать VaW для главного windows или любого другого windows. Фактически, вы можете использовать VaW и VaD . Этот последний можно использовать для внутренних элементов приложения, для которых не требуются windows. Вы улучшаете то, что лучше для вас, в зависимости от требований приложения и времени, которое можно найти при разработке приложения. Надеюсь, что этот личный опыт поможет …

  • Экзотические архитектуры, о которых заботятся комитеты по стандартам
  • Выход: GET или POST?
  • C Определение макроса для определения большой конечной или малоконечной машины?
  • В чем разница между REST & RESTful
  • ASP.NET MVC и веб-службы
  • Почему я должен изолировать объекты домена от своего уровня представления?
  • Избегание круговых зависимостей файлов заголовков
  • Что такое объект передачи данных?
  • Выбор типа инъекции зависимостей
  • Что я не понимаю в REST?
  • Когда целесообразно использовать частичные classы C #?
  • Interesting Posts

    Манипуляция строкой запроса в Java

    Область видимости переменной C #: «x» не может быть объявлена ​​в этой области, потому что она придавала бы значение «x»,

    Безопасно ли использовать miredo-клиент?

    Как лучше всего моделировать произвольную одномерную случайную переменную с использованием ее вероятностной функции?

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

    Защита исполняемого файла от обратной инженерии?

    Как получить строку android Path в файл в папке «Активы»?

    Установить переменные среды из файла

    Действительно простой TCP-клиент

    «В настоящий момент точка останова не будет удалена. Исходный код отличается от исходного. «Что это значит?

    Есть ли способ установить точку останова в gdb, которая является условной для стека вызовов?

    Восстановить данные после использования dban

    Matplotlib: установка x-пределов также заставляет метки тика?

    Могу ли я маршрутизировать программы на два интернет-соединения одновременно в Windows 7?

    MP3 vs M4A (AAC): что такое аудиокодек для портативных устройств, который обеспечивает максимальную независимость?

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