MVVM - Рабочий стол WPF - PullRequest
       23

MVVM - Рабочий стол WPF

0 голосов
/ 01 августа 2011

Только начал изучать MVVM.У меня есть tabcontrol, где я добавляю несколько экземпляров одинаковых представлений / страниц

    Dim tb As New UXTabItem

    tb.Header = "Childrens"

    tb.Name = "tab" & itrt
    itrt = itrt + 1

    tb.Source = New Uri("/Views/childrens.xaml", UriKind.Relative)
UXTabControl1.Items.Add(tb)

Поскольку каждое из этих представлений будет обрабатывать разные данные, но поскольку URI одинаковы, все вкладки заполняются одинаковым представлением иИзменения отражаются на каждой вкладке.Что не должно быть так.Должен ли я использовать отдельную viewmodel для каждого из них?Любой пример был бы очень полезен.

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

Одна из основных целей / преимуществ MVVM заключается в том, что вы не создаете объекты пользовательского интерфейса WPF в коде.

Вы должны заполнить коллекцию объектов модели представления и привязать к ней ItemsSource из TabControl, который вы определили в XAML. У вас должно быть DataTemplate, определенное для типа данных этих объектов, и поместите туда их XAML вместо загрузки во время выполнения.

TabControl немного сложнее, потому что он использует два шаблона: ItemTemplate используется для определения внешнего вида вкладки, а ContentTemplate используется для определения внешнего вида содержание элементов вкладки. Довольно часто можно увидеть это:

<TabControl ItemsSource="{Binding MyItems}">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Text}"/>
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate>
         <ContentPresenter Content="{Binding}"/>
      </DataTemplate>
   </TabControl.ContentTemplate>
</TabControl>

, который заполняет вкладку свойством Text в модели представления, а содержимое элемента вкладки с любым шаблоном в словаре ресурсов соответствует типу модели представления.

2 голосов
/ 01 августа 2011

У меня будет родительский ViewModel ObservableCollection<TabViewModel> Tabs, и я привяжу к нему ItemSource TabControl. Каждая вкладка имеет свой собственный экземпляр TabViewModel, поэтому добавление новой вкладки будет означать добавление новой TabViewModel в коллекцию Tabs в ParentViewModel.

TabViewModel будет содержать свойства для таких вещей, как Header или Uri, и они будут связаны с пользовательским интерфейсом в соответствующих местах. Каждая TabViewModel может быть нарисована с использованием одного и того же представления, но данные внутри объекта будут разными для каждой вкладки.

Мой ParentViewModel также будет содержать свойство TabIndex, которое определяет, какая вкладка выбрана

0 голосов
/ 01 августа 2011

Это НЕ тривиально, IMO, и Рэйчел, и Роберт оба правы.

Думайте, что эта задача состоит в управлении «рабочими пространствами», каждое из которых представлено элементом управления с вкладками. Мне нравится структурировать свое представлениемоделирует в три связанных слоя

  1. DetailViewModel - модель для заданного рабочего пространства (представлена ​​элементом управления с вкладками)
  2. MasterViewModel - модель для коллекции моделей подробного вида (ObservableCollection {DetailViewModel}). Вы можете использовать это для привязки к списку в нашей презентации, которая показывает, какие элементы могут быть выбраны для редактирования / отображения в элементе управления вкладками. Здесь также будет выполняться фильтрация списка, если вы позволите это.
  3. ShellViewModel - модель, которая фактически имеет коллекцию рабочих пространств (т. Е. ObservableCollection {Workspace} вместе с командами для управления ими (т. Е. EditWorkspaceCommand, AddWorkspaceCommand, DeleteWorkspaceCommand). Рабочим пространством является DetailViewModel, который имеет CloseCommand.

Я нашел Джош СмиЭта статья MVVM о MSDN полезна для использования этой схемы.

HTH,
Berryl

...