WPF:将多个 View 绑定(bind)到 TabControl 的项目

标签 wpf data-binding tabcontrol

在我们当前处理的项目中,我们有一个主窗口,其中包含多个 View (每个 View 都有自己的 View 模型),这些 View 在选项卡控件中显示为项目。例如:一个选项卡项是一个编​​辑器,并包含编辑器 View ,如下所示:

<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 绑定(bind)到主窗口 View 模型中的某些内容,但我不知道如何在不破坏 MVVM 模式的情况下将 View 的名称绑定(bind)到任何属性。我想要这样的东西:

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

仅需要一些绑定(bind),而不必在设计时知道将使用什么类型作为内容。
有什么想法吗?

最佳答案

通常,我将 TabControl 的选项卡以及 SelectedIndex 存储在 ViewModel 中,然后使用 DataTemplates 来确定哪个 查看显示

查看:

<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>

View 模型:

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");
            }
        }
    }
}

关于WPF:将多个 View 绑定(bind)到 TabControl 的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662876/

相关文章:

objective-c - 有谁知道 Mac OS X 应用程序的 Safari 风格选项卡控件?

c# - WPF Tabcontrol 获取最大选项卡的大小

c# - 查看不断变化的数据集的聚合的最佳架构选择是什么?

C# WPF Webbrowser msHTML - 探索 DOM - 查找元素

WPF 绑定(bind)到局部变量

asp.net - DropDownList 获取底层对象

android-studio - 片段数据绑定(bind),DataBinderMapperImpl.java 找不到符号 FragmentCollectionBindingImpl

wpf - 动态使背景颜色变浅

data-binding - AngularJS初学者数据绑定(bind)困惑

wpf - 如何改变wpf TabControl中TabItem的顺序