c# - 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;
}
}
解决方案
删除<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>
推荐阅读
- java - 如何在循环体中重新初始化循环的“i”变量?
- java - 测量单位是否应该始终包含在所有变量名称中?
- html - R Markdown 不呈现目录或选项卡集
- python - 用与每个字符串对应的数字替换字典中的元组值(字符串)?
- ldap - 通过 JNDI LDAP 将用户作为成员添加到 AD 组 - 条目存在
- arduino-esp8266 - Gobot 无法运行 Arduino Uno D1 Wemos ESP8266
- linux - RedHat 和 Ubuntu 之间的.so 补丁版本差异
- python - 需要完全按照导入的方式导出 csv
- javascript - Ionic 3 - 如何使用 valueChanges Observable 合并对象数组
- javascript - 使用在字符串数组中找到的键添加/删除数组对象