Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# TabControl未找到TabControl项的数据模板_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# TabControl未找到TabControl项的数据模板

C# TabControl未找到TabControl项的数据模板,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在将TabViewModel项的集合绑定到TabControl。其中每一个都有一个headerstring属性和一个自定义类型的内容属性BaseTabContentViewModel,每个实际的选项卡数据viewmodel都实现了一个抽象类。例如ValuationTabViewModel,它是BaseTabContentViewModel的一个子类 我将新的TabViewModel添加到Observable中,以便TabControl拾取并显示在UI中。我已经覆盖了选项卡控件和标题布局的样式

我正在将
TabViewModel
项的集合绑定到
TabControl
。其中每一个都有一个header
string
属性和一个自定义类型的内容属性
BaseTabContentViewModel
,每个实际的选项卡数据viewmodel都实现了一个抽象类。例如
ValuationTabViewModel
,它是
BaseTabContentViewModel
的一个子类

我将新的
TabViewModel
添加到
Observable
中,以便
TabControl
拾取并显示在UI中。我已经覆盖了选项卡控件和标题布局的样式模板,它们工作得很好。唯一的问题是内容没有根据其类型在我的资源字典中找到模板,它只是显示viewmodel的完整限定类名,表明它没有找到该类的默认模板

为什么显示的
评估选项卡viewmodel
没有在下面找到此类型的数据模板

我的主视图模型

public ObservableCollection<TabViewModel> DetailTabs { get; }

var valuationTab = new TabViewModel(DetailTabConstants.ValuationTab, new ValuationTabViewModel(_eventAggregator, _errorNotifier, _windsorContainer));

DetailTabs = new ObservableCollection<TabViewModel> { valuationTab };
删除
元素,并为每种类型定义一个隐式
数据模板(不带
x:Key
):

<TabControl Margin="0,-2,0,0" x:Name="SelectionTabs" Style="{StaticResource DetailTabControl}" ItemsSource="{Binding DetailTabs}" 
            SelectedValue="{Binding SelectedTab, Mode=TwoWay}" ItemContainerStyle="{StaticResource DetailTabItem}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
            <detailTabs:ValuationTab Margin="0,10,0,10" />
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

我认为您的自定义数据模板没有被使用,因为您已经为它指定了
键和
数据类型,并且
键优先

根据:

。。。如果为此DataTemplate分配一个x:Key值,则会覆盖隐式x:Key,并且DataTemplate不会自动应用

我建议删除
属性,只使用
数据类型

<DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
    ...
</DataTemplate>

...

此外,正如@mm8所暗示的,您正在显式设置TabControl的
ContentTemplate
。您需要将其从XAML中删除

public class TabViewModel : ViewModelBase
{
    private string _header;
    private BaseTabContentViewModel _content;

public string Header
{
    get => _header;
    set
    {
        _header = value; 
        RaisePropertyChanged(nameof(Header));
    }
}

public BaseTabContentViewModel Content
{
    get => _content;
    set
    {
        _content = value;
        RaisePropertyChanged(nameof(Content));
    }
}

public TabViewModel(string header, BaseTabContentViewModel viewModel)
{
    Header = header;
    Content = viewModel;            
}
}
<TabControl Margin="0,-2,0,0" x:Name="SelectionTabs" Style="{StaticResource DetailTabControl}" ItemsSource="{Binding DetailTabs}" 
            SelectedValue="{Binding SelectedTab, Mode=TwoWay}" ItemContainerStyle="{StaticResource DetailTabItem}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
            <detailTabs:ValuationTab Margin="0,10,0,10" />
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
<DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
    ...
</DataTemplate>