【问题标题】:TabControl not finding data templates for TabControl itemsTabControl 未找到 TabControl 项的数据模板
【发布时间】:2018-05-15 14:38:55
【问题描述】:

我将TabViewModel 项目的集合绑定到TabControl。其中每一个都有一个标题string 属性和我自己的自定义类型BaseTabContentViewModel 的内容属性,这是每个实际选项卡数据视图模型实现的抽象类。例如ValuationTabViewModelBaseTabContentViewModel 的子类。

我将新的 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# wpf xaml mvvm


    【解决方案1】:

    删除&lt;TabControl.ContentTemplate&gt; 元素并为每种类型定义一个隐式 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>
    

    【讨论】:

      【解决方案2】:

      我认为您的自定义 DataTemplate 没有被使用,因为您已为其指定了 KeyDataType,并且 Key 优先。

      根据Microsoft docs

      ...如果您为此 DataTemplate 分配 x:Key 值,您将覆盖隐式 x:Key 并且不会自动应用 DataTemplate

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

      <DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
          ...
      </DataTemplate>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 2013-01-29
        • 2017-01-07
        相关资源
        最近更新 更多