我将TabViewModel项的集合绑定到TabControl。其中每一个都有一个header string属性和一个属于我自己的自定义类型BaseTabContentViewModel的content属性,这是一个抽象类,每个实际的选项卡数据视图模型都实现了这个抽象类。例如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;
}
}发布于 2018-05-15 14:44:49
删除<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>发布于 2018-05-15 14:49:43
我认为您的自定义DataTemplate没有被使用,因为您已经为它指定了一个Key和一个DataType,并且Key优先。
根据微软文档
..。如果将此DataTemplate赋值为x:Key值,则将重写隐式x:Key,并且DataTemplate不会自动应用。
我建议删除Key属性,只使用DataType
<DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
...
</DataTemplate>此外,正如@mm8 8所暗示的,您正在显式地设置您的ContentTemplate的TabControl。您需要从XAML中删除它。
https://stackoverflow.com/questions/50353014
复制相似问题