Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 将viewmodels集合绑定到WPF MVVM选项卡控件_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 将viewmodels集合绑定到WPF MVVM选项卡控件

C# 将viewmodels集合绑定到WPF MVVM选项卡控件,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一组视图模型,我想绑定到TabControl的ItemsSource属性,并能够动态添加/删除它们,因此实现为一个可观察的 然而,TabControl似乎期望从可视控件对象TabItem继承的类型。我不希望我的ViewModels继承自TabItem,因为这意味着它们需要绑定到可视化实现,并且所有测试都需要作为STA运行 如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于TabItem对象?Ie仅使用基于ViewModel类型的样式和模板。就像您有一个ListBox并希

我有一组视图模型,我想绑定到
TabControl
ItemsSource
属性,并能够动态添加/删除它们,因此实现为一个
可观察的

然而,
TabControl
似乎期望从可视控件对象
TabItem
继承的类型。我不希望我的ViewModels继承自
TabItem
,因为这意味着它们需要绑定到可视化实现,并且所有测试都需要作为STA运行

如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于
TabItem
对象?Ie仅使用基于ViewModel类型的样式和模板。就像您有一个
ListBox
并希望使用特定模板直接从viewmodel实例渲染项目一样,通过覆盖
ItemTemplate
属性很容易做到这一点

如何使用
TabControl
而不使用
TabItem

如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于TabItem对象

试试这个:

查看:

<TabControl ItemsSource="{Binding Items}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Content}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
public class TabViewModel
{
    public TabViewModel()
    {
        Items = new ObservableCollection<Item>()
        {
            new Item { Header = "a", Content = "..." },
            new Item { Header = "b", Content = "..." },
            new Item { Header = "c", Content = "..." },
        };
    }

    public ObservableCollection<Item> Items { get; set; }
}

查看模型:

<TabControl ItemsSource="{Binding Items}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Content}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
public class TabViewModel
{
    public TabViewModel()
    {
        Items = new ObservableCollection<Item>()
        {
            new Item { Header = "a", Content = "..." },
            new Item { Header = "b", Content = "..." },
            new Item { Header = "c", Content = "..." },
        };
    }

    public ObservableCollection<Item> Items { get; set; }
}
public类TabViewModel
{
公共选项卡ViewModel()
{
Items=新的ObservableCollection()
{
新项目{Header=“a”,Content=“…”},
新项{Header=“b”,Content=“…”},
新项目{Header=“c”,Content=“…”},
};
}
公共ObservableCollection项{get;set;}
}

Item
是一个POCO类。

那么您想基于集合创建TabItems吗?不确定这是否正是您想要的,但这是我开始使用TabControl时使用的。我只是查了一下这个答案。很奇怪,太好了,我成功了。只有一件事我在问题中忘了提。我的内容项本身就是视图模型,每个视图模型都有一个模板,指示如何呈现它。我已经使用ItemContainerStyle为标题精细设置了模板,但无法确定如何设置内容样式。你知道怎么做吗?@NZJames:请看我的答案: