2013-11-18 3 views
2

Я строю приложение WPF, которое очень упрощенным выглядит примерно так:Сплит вид на два отдельных видах

My WPF application

У меня есть ApplicationView, который держит меню и ContentControl. ContentControl привязывается к свойству CurrentViewModel, которое задается в меню и отображается его соответствующим представлением (Views и ViewModels связаны с DataTemplates, определенными в App.xaml).

Я нашел этот подход на Rachel Lim's blog

Таким образом, в этом примере мой взгляд содержит список обязанностей, а также окно «Подробности» в выбранной обязанности.

Эта настройка работает нормально, но я думаю, что мои ViewModels становятся слишком толстыми! Не-упрощенная версия этой ViewModel составляет примерно в 500 строк кода, для обработки:

  • Initializing фильтры
  • Logic для списка фильтрации
  • Отображение деталей пошлины
  • Добавить/Обновить/Отмена/Удалить логику

Теперь я очень новичок в WPF, но это похоже на слишком много кода, да? И это будет еще больше, прежде чем я закончу это.

В любом случае, я думал, что могу разделить ViewModel на две отдельные модели ViewModels; один для хранения списка и фильтров и один для отображения деталей. Но как это лучше всего сделать?

Я подумал о двух подходах, но не знаю, что является предпочтительным:

  1. Создать DutyMasterView, единственная цель состоит в том, чтобы провести два ContentControls для действительных представлений (т.е. DutyListView и DutyDetailView каждый со своими собственный ViewModel)? Я использую MVVM Light в качестве моей структуры, поэтому, полагаю, я мог бы использовать службу обмена сообщениями, чтобы сообщить DutyDetailViewModel, что Duty для отображения, не так ли? Альтернативно создайте DutyMasterViewModel, который отображает выбранный режим.

  2. Ditch DutyMasterView и гнездо DutyDetailView в DutyListView.

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

+3

500 строк * не * большой файл, на мой взгляд. – Sheridan

+0

Решите, что лучше для вас. По-моему, ViewModels с более чем 500 LOC, как правило, трудно поддерживать. – metacircle

+0

Если задача DutyDetailViewModel заключается в том, чтобы показывать обязанность, я не вижу смысла использовать обмен сообщениями. Просто обновите свойство в главной виртуальной машине, чтобы вернуть другую детальную виртуальную машину. – nmclean

ответ

0

Если вы все еще ищете мнение, я бы сделал это почти так, как вы упомянули в пункте 1, но вам не нужны обмен сообщениями. Вы создаете две виртуальные машины. Скажем, DutiesVM и DutyDetailVM. DutyDetailsVM содержит только некоторые свойства строки для ID и Name. В DutiesVM создать два свойства:

ObservableCollection<DutyDetailVM> DutiesList 
DutyDetailVM SelectedDuty 

Ваш DutiesView может выглядеть следующим образом:

<DockPanel> 
    <v:DutyDetailV DockPanel.Dock="Right" DataContext="{Binding SelectedDuty}"> 
    <ListBox ItemsSource="{Binding DutiesList}" SelectedItem="{Binding SelectedDuty}"/> 
</DockPanel> 

Теперь вы можете создать ListView ItemTemplate, который связывается с DutyDetailVM Свойства. - пользовательский элемент управления, определяющий представление DutyDetail. Выбор элемента в списке автоматически обновляет элемент управления данными.

Это только эскиз, но я думаю, вы можете получить от него точку.

Смежные вопросы