首页 > 解决方案 > TabControl 未找到 TabControl 项的数据模板

问题描述

我将一组TabViewModel项目绑定到一个TabControl. 其中每一个都有一个 headerstring属性和一个我自己的自定义类型的 content 属性BaseTabContentViewModel,一个每个实际的选项卡数据视图模型实现的抽象类。例如ValuationTabViewModel,它是 的子类BaseTabContentViewModel

我将新添加TabViewModel到 以Observable<TabViewModel>TabControl拾取,它会显示在 UI 中。我已经为选项卡控件和标题的布局覆盖了样式模板,这些模板可以正常工作。唯一的问题是内容没有根据它的类型在我的资源字典中找到模板,它只显示视图模型的完整限定类名称,表明它没有找到这个类的默认模板。

为什么没有ValuationTabViewModel显示,在下面找到此类型的数据模板?

我的主视图模型。

public ObservableCollection<TabViewModel> DetailTabs { get; }

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

DetailTabs = new ObservableCollection<TabViewModel> { valuationTab };

主要 XAML

                            <TabControl Margin="0,-2,0,0" x:Name="SelectionTabs" Style="{StaticResource DetailTabControl}" ItemsSource="{Binding DetailTabs}" 
                                        SelectedValue="{Binding SelectedTab, Mode=TwoWay}" ItemContainerStyle="{StaticResource DetailTabItem}">
                                <TabControl.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Header}" />
                                    </DataTemplate>
                                </TabControl.ItemTemplate>
                                <TabControl.ContentTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Content}" />
                                    </DataTemplate>
                                </TabControl.ContentTemplate>
                            </TabControl>

我希望它使用的内容样式模板

<DataTemplate x:Key="ValuationTabTemplate" DataType="{x:Type detailTabs1:ValuationTabViewModel}" >
        <detailTabs:ValuationTab Margin="0,10,0,10" />
    </DataTemplate>

还有我的 Tab 项 ViewModel 类

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;            
}
}

标签: c#wpfxamlmvvm

解决方案


删除<TabControl.ContentTemplate>元素并为每种类型定义一个隐式 DataTemplate(不带):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>

推荐阅读