c# - WPF TabControl 与 ContentControl

标签 c# wpf mvvm tabcontrol

我在 SO 上搜索了很多,但没有找到我的问题的答案。 我想将 TabControl 与 MVVM 一起使用。以下是我将 TabControl 添加到 MainWindow.xaml 的方法

<Window.Resources>
        <DataTemplate DataType="{x:Type models:PartnersViewModel}">
            <views:PartnersView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type models:ProjectsViewModel}">
            <views:ProjectsView />
        </DataTemplate>
    </Window.Resources>

    <Window.DataContext>
        <models:ApplicationViewModel/>
    </Window.DataContext>

    <TabControl ItemsSource="{Binding PageViewModels}"  TabStripPlacement="Left">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}" />
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

PageViewModels 是 ObservableCollection<IPageViewModel> . IPageViewModel是具有一个属性的简单界面 Name .此接口(interface)有 2 个实现 PartnersViewModelProjectsViewModel .

public class ProjectsViewModel : IPageViewModel
{
    public String Name
    {
        get { return "Projects"; }
    }
}

public class PartnersViewModel : IPageViewModel
{
    public String Name
    {
        get { return "Partners"; }
    }
}

我希望每个选项卡都显示为 ContentControl。标题文本取自 Name 属性。我的 ProjectsView 和 PartnersView 如下所示:

<UserControl x:Class="WANIRPartners.Views.ProjectsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" >
  <Grid>
    <Label Content="Projects Content" />
  </Grid>
</UserControl>

TabControl 中使用此代码、标题和内容是完全一样的。 “项目内容”/“合作伙伴内容”显示在选项卡标题中,并且(这没关系)显示在选项卡内容中。当我改变 <Label/><DataGrid/>选项卡标题包含数据网格(原文如此!)。 我怎样才能让它正常工作。我的意思是如何将标题显示为属性值 Name和正确呈现的选项卡内容 <views:PartnersView /><views:ProjectsView />取决于 PageViewModels 中的内容.

最佳答案

你的代码应该可以工作,没有 IDE atm。您还可以使用 Snoop 在运行时检查您的绑定(bind)。我将 ContentTemplate 更改为:

    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding .}" />
        </DataTemplate>
    </TabControl.ContentTemplate>

并且有效。但即使是您的代码也能在我的测试应用程序中运行。

关于c# - WPF TabControl 与 ContentControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29727860/

相关文章:

c# - 只要TextBox具有键盘焦点,就保持弹出窗口处于打开状态并处于事件状态

C#:匿名类型作为 ActionFilterAttribute 的参数

c# - ClickOnce 发布期间出错

c# - WPF 动画未触发

屏幕从 sleep 中唤醒后,WPF 应用程序窗口未完全刷新

javascript - Vue.js 2.0 : Apply vue component rendered using v-html, 编译标记

javascript - C# 和 JavaScript 中的 DateTime 整数值

c# - 是否可以在应用程序设置中使用自定义枚举? (VS10)

WPF - Task.Run(() => window.ShowDialog) 失败

android - 我可以获取 ViewModel 的 init block 内的上下文吗?