Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 使用不同的用户控件创建选项卡项';制表符控制_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 使用不同的用户控件创建选项卡项';制表符控制

C# 使用不同的用户控件创建选项卡项';制表符控制,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,首先,我对WPF和MVVM有点陌生,所以你可以期待这里有一些疯狂的混合,只是建议更改,我来学习。 这个问题是我的继续 我有一个TabControl,在XAML中定义了一些TabItem,每个选项卡都有自己的UserControl XAML 如果我使用上面链接的答案的示例运行良好,我可以单独创建选项卡,结果选项卡和配置选项卡保持不变。 但是,如果我使用UserControl新的TabItem我从我的集合中创建,则将我的UserControl放入TabItem.Header 如果我没有遵循MVV

首先,我对WPF和MVVM有点陌生,所以你可以期待这里有一些疯狂的混合,只是建议更改,我来学习。
这个问题是我的继续

我有一个
TabControl
,在
XAML
中定义了一些
TabItem
,每个选项卡都有自己的
UserControl

XAML


如果我使用上面链接的答案的示例运行良好,我可以单独创建选项卡,结果选项卡和配置选项卡保持不变。

但是,如果我使用
UserControl
新的
TabItem
我从我的集合中创建,则将我的
UserControl
放入
TabItem.Header

如果我没有遵循MVVM,并且我创建了一个
observateCollection
按预期工作,那么我假设问题出现在
选项卡control.DataTemplate

如有任何想法或建议,将不胜感激

编辑:由于应用程序和相关代码的复杂性,我无法提供一个工作示例,因此我添加以下图片来解释问题:

期望视图

使用
ContentTemplateSelector
内部
TabControl

<Window.Resources>
        <DataTemplate x:Key="DetailedTemplate" DataType="{x:Type viewModels:DetailedViewModel}">
            <views:DetailedView/>
        </DataTemplate>
        <DataTemplate x:Key="ConfigurationTemplate" DataType="{x:Type viewModels:ConfigurationViewModel}">
            <views:ConfigurationView />
        </DataTemplate>
        <DataTemplate x:Key="ResultTemplate" DataType="{x:Type viewModels:ResultViewModel}">
            <views:ResultView/>
        </DataTemplate>

        <helpers:MyViewSelector x:Key="Selector" 
                                DetailedTemplate="{StaticResource DetailedTemplate}" 
                                ConfigurationTemplate="{StaticResource ConfigurationTemplate}"
                                ResultTemplate="{StaticResource ResultTemplate}"/>

</Window.Resources>
助手

    public class MyViewSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object inItem, DependencyObject container)
        {
            if (inItem == null)
            {
                return ResultTemplate;
            }

            if (inItem is DetailedViewModel)
            {
                return DetailedTemplate;
            }
            if (inItem is ResultViewModel)
            {
                return ResultTemplate;
            }
            if (inItem is ConfigurationViewModel)
            {
                return ConfigurationTemplate;
            }

            return ResultTemplate;
        }

        public DataTemplate DetailedTemplate { get; set; }
        public DataTemplate ConfigurationTemplate { get; set; }
        public DataTemplate ResultTemplate { get; set; }

    }
来源:




您尚未提供您的问题的最小、完整且可验证的示例:。除了硬编码的选项卡,您是否看到了所有选项卡?或者您的问题是什么?我尝试过。但由于这是一个复杂的问题,我无法为视图和viewsModel提供所有必要的代码,因为它抱怨“您的问题上有太多代码”。你可以告诉我你错过了什么,我可以试着为它提供编辑。最小视图模型和最小视图都可以编译。当我在
TabItemsVM
中添加新对象时,“硬编码”选项卡会消失。我将试着准备一个简单的例子。
ContentPresenter
应该只在
ControlTemplate
中使用,而不是使用
ContentControl
<TabControl Grid.Row="1"
                    Grid.Column="0"
                    VerticalAlignment="Stretch"
                    BorderThickness="0.5"
                    BorderBrush="Black"
                    ContentTemplateSelector="{StaticResource Selector}">
            <TabControl.Resources>
                <CollectionViewSource Source="{Binding Model.DetailsVM}" x:Key="Tabs"/>
                <DataTemplate DataType="{x:Type viewModels:DetailedViewModel}">
                    <TextBlock Text="{Binding Model.SelectedItem.FileInfo.Name, Mode=OneWay}"/>
                </DataTemplate>
            </TabControl.Resources>
            <TabControl.ItemsSource>
                <CompositeCollection>
                    <!--Result View-->
                    <TabItem Header="Import" Content="{Binding ResultViewModel}"/>
                    <!--Configuration Tab-->
                    <TabItem Header="Configuration" Content="{Binding ConfigViewModel}"/>    
                    <!--Others-->
                    <CollectionContainer Collection="{Binding Source={StaticResource Tabs}}"/>
                </CompositeCollection>
            </TabControl.ItemsSource>

</TabControl>
    public class MyViewSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object inItem, DependencyObject container)
        {
            if (inItem == null)
            {
                return ResultTemplate;
            }

            if (inItem is DetailedViewModel)
            {
                return DetailedTemplate;
            }
            if (inItem is ResultViewModel)
            {
                return ResultTemplate;
            }
            if (inItem is ConfigurationViewModel)
            {
                return ConfigurationTemplate;
            }

            return ResultTemplate;
        }

        public DataTemplate DetailedTemplate { get; set; }
        public DataTemplate ConfigurationTemplate { get; set; }
        public DataTemplate ResultTemplate { get; set; }

    }