Создание ViewModel: сделать это до или после того, как станут доступны данные модели? - PullRequest
3 голосов
/ 22 апреля 2010

У меня есть приложение WPF, которое загружает данные из источника данных.

Пока не загружены некоторые данные, отображать нечего.

У меня вопрос:

  • Создайте V и VM, прежде чем доступны какие-либо данные; установить данные в ВМ, когда они станут доступны
  • Создать только V в начале; подождите, пока данные не станут доступны, затем создайте виртуальную машину, вводящую данные
  • Создать V и VM только после того, как данные станут доступны

Ответы [ 4 ]

8 голосов
/ 22 апреля 2010

Я говорю: создайте V и VM, прежде чем доступны какие-либо данные; установите данные в ВМ, как только они станут доступны.

Показать индикатор IsLoading перед загрузкой данных и загрузить данные в отдельный поток. В противном случае, если загрузка данных займет некоторое время, вы получите страшный черный экран wpf.

Будет лучше, если представление загружается сразу, даже если вам придется ждать загрузки данных, оно воспринимается как более быстрое.

4 голосов
/ 22 апреля 2010

То, что я делаю, - это немедленно создаю виртуальную машину и вид, и отображаю вид.

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

Моя ВМ подписывается на события в Модели, которые отправляются на ВМ по мере их возникновения. В View XAML я привязываю данные к ВМ для каждого свойства ВМ.

Таким образом, пользователь получает информацию.

2 голосов
/ 22 апреля 2010

Я принял то, что делает Джош Смит в своей статье о MSDN здесь ... Прокрутите вниз до той части, где он говорит о применении View к ViewModel. При этом View создается при визуализации ViewModel. Больше нет необходимости создавать представление вручную, а затем назначать DataContext вашей ViewModel. Это делает это автоматически для вас.

"Вы можете легко указать WPF, как визуализировать объект ViewModel, используя типизированные DataTemplates. Типизированному DataTemplate не назначено значение x: Key, но его свойство DataType имеет значение экземпляра класса Type Если WPF попытается отобразить один из ваших объектов ViewModel, он проверит, имеет ли система ресурсов типизированный DataTemplate в области действия, тип данных которого совпадает с (или базовым классом) типом вашего объекта ViewModel. во-первых, он использует этот шаблон для визуализации объекта ViewModel, на который ссылается свойство Content элемента вкладки. "

Другими словами, вы бы создали свою ViewModel так:

MyViewModel viewModel = new MyViewModel();

// Add the view model to the content of some control (TabItem, Grid, Window, etc.)
// NOTE: You wouldn't actually make this call... instead you would add the
// ViewModel to a collection or a property and the parent would bind
// to it and display it properly
MyContainer.Content = viewModel;

И в вашем ResourceDictionary вы определяете это:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:DemoApp.ViewModel"
    xmlns:vw="clr-namespace:DemoApp.View"
    >

   <!-- NOTE: The View must be a UserControl (or page) -->
   <DataTemplate DataType="{x:Type vm:MyViewModel}">
       <vw:MyView />
   </DataTemplate>

</ResourceDictionary>
1 голос
/ 22 апреля 2010

Создание только View без viewModel бессмысленно для IMO - как насчет всех связанных свойств View? Им нечего связывать, так как нет ViewModel. Тот факт, что вы не видите никаких исключений, не означает, что все в порядке:)

Конечно, вы должны создавать свои ViewModels для всех видов (конечно же, видов, используемых в данный момент :)) в самом начале - это не просто рекомендуется, а обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...