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
。其中每一个都有一个headerstring
属性和一个自定义类型的内容属性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>