WPF: привязка нескольких представлений к элементам TabControl - PullRequest
2 голосов
/ 05 октября 2011

В текущем проекте, над которым мы работаем, у нас есть главное окно с несколькими представлениями (каждое со своей собственной моделью представления), которые представлены как элементы в элементе управления вкладкой.Например: один элемент вкладки является редактором и содержит следующий вид редактора:

<TabItem Header="Test Editor">
            <TestEditor:TestEditorView DataContext="{Binding TestEditorViewModel}"/>
</TabItem>

Другой показывает результаты:

<TabItem Header="Results Viewer">
     <ResultViewer:ResultViewer x:Name="resultViewer1" DataContext="{Binding Path=ResultViewModel}"  />
</TabItem>

и т. Д.
Я бы хотелиметь привязку TabItems к чему-либо в модели представления главного окна, но я не могу понять, как связать имя представления с любым свойством, не нарушая шаблон MVVM.Я хотел бы иметь что-то вроде:

 <TabControl.ContentTemplate>
     <DataTemplate>
         <TestEditor:TestEditorView DataContext ="{Binding TabDataContext}"/>
     </DataTemplate>
 </TabControl.ContentTemplate>

только с некоторой привязкой вместо необходимости знать во время разработки, какой тип будет использоваться в качестве контента.
Есть идеи?

1 Ответ

4 голосов
/ 05 октября 2011

Обычно у меня есть вкладки TabControl, хранящиеся в ViewModel, вместе с SelectedIndex, затем я использую DataTemplates, чтобы определить, какие View отображать

Вид:

<Window>
    <Window.Resources>
        <DataTemplate DataType="{x:Type ResultViewModel}">
            <ResultViewer:ResultViewer />
        </DataTemplate>
        <DataTemplate DataType="{x:Type EditorViewModel}">
            <TestEditor:TestEditorView />
        </DataTemplate>
    </Window.Resources>

    <TabControl ItemsSource="{Binding TabCollection}"
                SelectedIndex="{Binding SelectedTabIndex}" />

</Window>

ViewModel:

public class MyViewModel : ViewModelBase
{

    publicMyViewModel()
    {
        TabCollection.Add(new ResultsViewModel());
        TabCollection.Add(new EditorViewModel());
        SelectedTabIndex = 0;
    }

    private ObservableCollection<ViewModelBase> _tabCollection
        = new ObservableCollection<ViewModelBase>();

    public ObservableCollection<ViewModelBase> TabCollection
    {
        get { return _tabCollection };
    }

    private int _selectedTabIndex;
    public int SelectedTabIndex
    {
        get { return _selectedTabIndex; }
        set
        {
            if (value != _selectedTabIndex)
            {
                _selectedTabIndex = value;
                RaisePropertyChanged("SelectedTabIndex");
            }
        }
    }
}
...