首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TabControl找不到TabControl项的数据模板

TabControl找不到TabControl项的数据模板
EN

Stack Overflow用户
提问于 2018-05-15 14:38:55
回答 2查看 292关注 0票数 1

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

我将新的TabViewModel添加到Observable<TabViewModel>中,以供TabControl选择,并显示在UI中。我已经重写了选项卡控件和标头布局的样式模板,它们可以很好地工作。唯一的问题是,内容没有根据它的类型在我的资源字典中找到模板,它只是显示视图模型的完整限定类名,显示它没有为这个类找到默认模板。

为什么正在显示的ValuationTabViewModel没有在下面找到这种类型的数据板?

我的主视图模型。

代码语言:javascript
复制
public ObservableCollection<TabViewModel> DetailTabs { get; }

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

DetailTabs = new ObservableCollection<TabViewModel> { valuationTab };

主XAML

代码语言:javascript
复制
                            <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>

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

代码语言:javascript
复制
<DataTemplate x:Key="ValuationTabTemplate" DataType="{x:Type detailTabs1:ValuationTabViewModel}" >
        <detailTabs:ValuationTab Margin="0,10,0,10" />
    </DataTemplate>

和我的Tab项目ViewModel类

代码语言:javascript
复制
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;            
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 14:44:49

删除<TabControl.ContentTemplate>元素并为每种类型定义隐式DataTemplate (没有x:Key):

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2018-05-15 14:49:43

我认为您的自定义DataTemplate没有被使用,因为您已经为它指定了一个Key和一个DataType,并且Key优先。

根据微软文档

..。如果将此DataTemplate赋值为x:Key值,则将重写隐式x:Key,并且DataTemplate不会自动应用。

我建议删除Key属性,只使用DataType

代码语言:javascript
复制
<DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
    ...
</DataTemplate>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50353014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档