2010-05-06 4 views
0

Итак, как вы показываете сложные агрегированные ViewModels, у моделей которых есть отношения друг с другом?MVVM - несколько рабочих мест в рабочей области, кажется, не имеют смысла

NO МОФ ученик никогда не говорил об этом, думаю, почему его не возможно ...

Как вы думаете, это правда?

Не поймите меня?

Смотри: A CustomerViewModel имеет много OrderViewModel и тех, кто много ProductViewModel.

Вы 3 Workspaces ввести новые данные для всех 3 ViewModels И у вас есть 3 ListBoxes/combobo/DataGrid к MULTISELECT Коллекции типа => customerVM s, orderVM с и productVM`s.

Что пользовательский интерфейс имеет смысл для пользователя, который ему не нужно отключать/на рабочем месте, каждый новый клиент/заказ/продукт добавляется, что плохой пользовательский опыт, как вы делаете это типичное требование приложения LOB?

EDIT:

Вы в MVVM Коллекцию типа WorkSpace. Каждая ViewModel может быть рабочей областью, потому что она происходит из класса WorkSpace. Коллекция Workspaces привязана к примеру ItemsSource afair josh smith.

Заявление: Я хочу использовать Гулд зрелые окна формирует пользовательские интерфейсы не закрывающиеся ViewModels ... Проблема: MVVM может работать только с рабочими пространствами (закрываемой не имеет значения, ...), так как CustomerviewModel уже должен быть создан а затем добавляется в коллекцию рабочих пространств, связанную с элементами itemsControl и datatemplated в зависимости от типа данных.

Если бы у меня не было рабочих пространств, в которых хранятся экземпляры ViewModel, я не мог бы их привязать, потому что ViewModel в MVVM принимает модель как параметр конструктора. DataTemplating UserControl с DataType CustomerViewModel выкинет исключение в XAML!

Теперь посмотрит на моем UI я хочу иметь: У меня нет рабочих областей, но 3 ViewModels = 3 UserControls datatemplated средства 3 раза в больших взрывах ...

Вы теперь, почему я не люблю MVVM? Его не очень хорошо, и я ищу решение ...

Конечно, я мог бы поместить мои ViewModels aka DataFormulars в ObservableCollection, но я не хочу, чтобы они привязывались к ItemsControl. Я хочу, чтобы эти 3 UserControl имели определенную позицию в моем макете. с ItemsControl у вас есть глупая очередь, где новый Dataformular просто добавлен и завернут, если он не вписывается в существующее пространство. То есть дизайн компоновки мусора/плохой интерфейс.

Вы меня поняли?

ответ

2

Вы можете легко иметь несколько элементов управления в окне, каждый из которых связан с другой ViewModel.Для координации между виртуальными машинами типичный подход заключается в том, чтобы свободно связывать разные компоненты вместе, используя передачу сообщений. Например, ваш клиент ViewModel может отправить сообщение о том, что вы выбрали заказ, а затем ваш OrderViewModel (визуализированный как элемент управления в части вашего основного окна, возможно), увидит сообщение и изменит отображаемый заказ.

Вы можете выполнить нечто подобное с общим классом обслуживания, который предоставляет интерфейс, который вы вводите в каждую вашу виртуальную машину. Затем вы можете связать свойства этого общего интерфейса, чтобы виртуальные машины могли общаться, так же, как и с сообщениями. Я использовал что-то похожее на это, чтобы представить концепцию «SelectedObject», в которой можно выбрать широкий диапазон различных типов объектов, а разные виртуальные машины в моем приложении имеют разные способы визуализации. Например, используя ваш пример, если Product стал SelectedObject, у вас может быть панель «подробно», которая теперь отображает Продукт с помощью некоторого стандартного ProductDataTemplate и, возможно, другой панели (отображающей заказ), изменит список SelectedItem в списке продуктов. Вы можете легко иметь несколько «рабочих пространств», и все они остаются в синхронизации с eachother благодаря набору свойств или сообщений, которые виртуальные машины используют для совместной работы.

+0

Конечно, окно может иметь несколько элементов управления, связанных с типом данных viewmodel. Это не то, о чем я говорю. My Master-Detail с продуктом/клиентом/заказ - -ViewModelcollection отлично работает без обходного пути, используя некоторую систему сообщений. Просто используйте IsSynchronizedTocurrentItem в своих VM-Collections и привяжите их, все переключится нормально. Подробнее о редактировании см. Выше. – msfanboy

+0

вы знаете, что, я думаю, я был частично неправ. Сегодня я проверил Чинч, который представляет собой рамки mvvm Sacha Barber, и он внезапно открыл глаза. Он не использует конструктор в своей модели CustomerViewModel. Я знаю, почему ;-) Он загружает связанные заказы и продукты LAZILY. Я делаю это EAGERLY привязаны к моей combobox с привязкой к AllCustomersViewModel. Проблема заключается в ленивой/нетерпеливой загрузке связанных данных. Ваш правый Дэн, если я использую ленивую загрузку, я запускаю выбранный CustomerViewModel в другое место через Messenger, чтобы отображать связанные OrderViewModels в DataGrid, например. – msfanboy

+0

Я вижу первый абзац, который вы написали как решение, потому что вы посоветовали то, что я видел в Chinch, и похоже, что я меняю свою стратегию загрузки, чтобы я мог использовать конструктор ViewMOdels, hurrraaayy XD – msfanboy