2013-02-21 2 views
0

пытается создать w mainwindow, у которого будет tabcontrol, содержащий несколько элементов (каждый отображается только по запросу) ... допустим, у нас есть элемент типа A, элемент типа B и элемент типа C Я хочу (используя шаблон MVVM) иметь наблюдаемый коллекцию объектов, которые представляют мои tabitems и которые связаны с моими пользователями (каждый tabitem является usercontrol) ... Проблема в том, что я не фигурировал как это сделать.Binding TabControl to ObservableCollection with Different Content

я имею класс tabItemViewModelBase:

public class TabItemViewModelBase : ViewModelBase 
    { 

     //Fields : 
     RelayCommand _closeCommand; 


     //Constructor: 
     public TabViewModel(string header) 
     { 
      this.Header = header; 
     } 

} 

в моем контексте данных MainWindow, я наблюдаемую коллекцию этого класса:

//Propriétés 
     ObservableCollection<TabViewModel> _tabItems; 

В моей MainWindow я уже следующий тег для TabControl Товар

<TabControl Padding="0" ItemsSource="{Binding Path=Workspaces}"> 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Header}"/> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        **<view:ClientView/>** 
       </DataTemplate> 
      </TabControl.ContentTemplate> 

     </TabControl> 

, но, как вы можете видеть, все элементы прилагаются к ClientV iew Пользовательский контроль и я использую tabviewitem для создания своих элементов, мне нужно свойство или способ указать форму содержимого для каждого элемента наблюдаемого коллекций ...

(у меня есть класс ClientListingViewModel и класс ClientCreationViewModel), и я не могу использовать оба, потому что я не знаю, как указать представление для каждого из них!

Спасибо!

ответ

4

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

Прежде всего вам нужно добавить ссылку на пространство имен на ваши пространства представлений и пространства viewmodel. Я включил пример с помощью Window, но он также работает для UserControls.

<Window ... 
     xmlns:v="clr-namespace:PutYourViewNamespaceHere" 
     xmlns:vm="clr-namespace:PutYourViewModelNamespaceHere"> 

Далее вам нужно будет определить данные в разделе ресурсов вашего контейнера. В приведенном ниже примере я использую ClientListingView как DataTemplate для ClientListingViewModel

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:ClientListingViewModel"> 
      <v:ClientListingView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:ClientCreationViewModel"> 
      <v:ClientCreationView /> 
    </DataTemplate> 
</Window.Resources> 
+1

Малого уведомления - Это лучше положить ваше DataTempalates декларации в app.xaml, или в любом файле ресурсов объединен в App.xaml. Это должно сэкономить вам некоторую память (особенно в случае usercontrols). – Woodman

+0

Проблема заключается в том, что часть viewModel находится в библиотеке anther, и когда я пытаюсь ссылаться на нее в файле XML, я не могу получить доступ ко всем классам ViewModel (делать {x: Тип vm: ClientListingViewModel) – Mohtaa

+0

У меня есть доступ только для одного класса моего видаModel – Mohtaa