Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM将视图绑定到TabControlItems-视图不';t显示_C#_Wpf_Mvvm_Binding_Tabcontrol - Fatal编程技术网

C# MVVM将视图绑定到TabControlItems-视图不';t显示

C# MVVM将视图绑定到TabControlItems-视图不';t显示,c#,wpf,mvvm,binding,tabcontrol,C#,Wpf,Mvvm,Binding,Tabcontrol,我想在主视图的选项卡ControlItems中显示不同的视图 为此,我创建了如下类: public sealed class TabItem { public string Header { get; set; } public ViewModelBase Content { get; set; } } 我在ViewModel中调用的列表: private ObservableCollection<TabItem> _views; public Observable

我想在主视图的
选项卡ControlItems
中显示不同的视图

为此,我创建了如下类:

public sealed class TabItem
{
    public string Header { get; set; }
    public ViewModelBase Content { get; set; }
}
我在ViewModel中调用的
列表

private ObservableCollection<TabItem> _views;
public ObservableCollection<TabItem> Views
{
    get { return _views; }
    set
    {
        _views = value;
        RaisePropertyChanged(() => Views);
    }
}

public IndexMainViewModel()
{
    Views = new ObservableCollection<TabItem>();
    Views.Add(new TabItem { Header = "Export", Content = new ExportViewModel() });
    Views.Add(new TabItem { Header = "Import", Content = new ImportViewModel() });  
}
private observeCollection\u视图;
公众意见收集
{
获取{return\u views;}
设置
{
_视图=值;
RaisePropertyChanged(()=>视图);
}
}
公共索引mainViewModel()
{
视图=新的ObservableCollection();
添加(新选项卡项{Header=“Export”,Content=new ExportViewModel()});
添加(新选项卡项{Header=“Import”,Content=newimportviewmodel()});
}
编辑然后在我的视图中显示:

<window xmlns:views="clr-namespace:EDICOT_Module_Import_Export_Articles.View"
xmlns:vm="clr-namespace:EDICOT_Module_Import_Export_Articles.ViewModel"
xmlns:model="clr-namespace:EDICOT_Module_Import_Export_Articles.Model.Classes"
DataContext="{Binding IndexMainVM, Source={StaticResource Locator}}">

   <TabControl ItemsSource="{Binding Views}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type model:TabItem}">
            <DataTemplate.Resources>
                <DataTemplate DataType="{x:Type vm:ImportViewModel}">
                    <views:ImportView />
                </DataTemplate>
                <DataTemplate DataType="{x:Type vm:ExportViewModel}">
                    <views:ExportView />
                </DataTemplate>
            </DataTemplate.Resources>
            <ContentControl Content="{Binding Content}"/>
        </DataTemplate>
    </TabControl.Resources>

    <TabControl.ItemTemplate >
        <DataTemplate >
            <TextBlock Text="{Binding Header}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

问题在于,它只显示标题而不显示内容(视图),而是显示TabItem类的路径

为了提供更多信息:我截短了代码,只保留主题需要的内容,并且使用MVVM Light


我真的不明白我在这里错过了什么!谢谢您的帮助。

问题是每个选项卡都绑定到
TabItem
的一个实例。您有用于
vm:ExportViewModel
vm:ImportViewModel
的数据模板。你现在看到你的错误了吗

有很多解决方案。最简单的方法是将标题文本移动到基本视图模型中,并将该选项卡控件绑定到一组视图模型

另一种选择是为
TabItem
添加一个数据模板,在其中粘贴一个ContentControl,并将其绑定到视图模型。下面是一些类似xaml的伪代码来说明这个想法:

<DataTemplate DataType="{x:Type vm:TabItem}">
    <ContentControl Content={Binding Content}" />
</DataTemplate>
将其实例添加到某个资源中

<derp:TabItemDataTemplateSelector x:Key="tidts"/>

然后把它绑在



thx很多关于你的答案,我在实例化
TabItems
时就猜到了类似的事情,但现在仍然有点悲观,你能精确一点吗?我将更仔细地查看您的第一个和第二个解决方案,如果可行,我将进行编辑。对于第三种解决方案,您是否有更多的解释或示例谢谢mate@RizzCandy默认DataTemplateSelector查看绑定中对象的类型,然后在可视化树中查找DataType属性与此类型匹配的DataTemplate。它对TabItem或其内容属性一无所知。添加了一些类似c#和xaml的伪代码,这些伪代码应该可以为您提供指导。Thx很多,但我尝试了许多解决方案,但都没有成功,并得出了这样的结论:当我使用MVVM Light时,我的TabItem属性
ViewModelBase
未定义,即使我的TabItem集合中有ViewModel。因此,当在视图中调用内容时,它不知道要显示什么。现在我不知道该怎么弄清楚!你是对的,我只是缺少了
DataTemplate.resources
ContentControl
的语法。工作完美。我已经编辑了我的代码,以使用正确的语法。我将保留您的第三个解决方案作为另一个案例的资产,因为它看起来非常有趣。我碰巧发现自己又回到了数据模板选择器链帮派,而我的示例实现完全不起作用,据我所知。DataTemplateSelector的基本实现不起作用。现在我要把所有的东西都挖出来,找到我以前做过的事情。
<derp:TabItemDataTemplateSelector x:Key="tidts"/>
<TabControl ItemsSource="{Binding Views}"
            ContentTemplateSelector={StaticResource tidts}>