如何在 TabControl 模板中使用自定义 TabItem?

How to use custom TabItem in a TabControl template?

我在自定义控件库中有一个 CustomTabItem。当我在 xaml 或代码中明确使用它时,它起作用了。当我使用绑定到 ViewModel (CaliburnMicro) 而不是我的控件时,使用标准 TabItem。 xaml中如何指定使用CustomTabItem?
我试图指定 DataType = "{x:Type adc:ActorTabItem}" - 没有用。

我试图指定 DataType="{x:Type adc:CustomTabItem}" - 没有用。

        <adc:TabControl ItemsSource="{Binding Pages}" Grid.Row="1">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>

            <adc:TabControl.ContentTemplate>
                <DataTemplate>
                    <ContentControl cal:View.Model="{Binding}" />
                </DataTemplate>
            </adc:TabControl.ContentTemplate>
        </adc:TabControl>

这里发生了两件事:

  1. 您需要继承 TabControl 并覆盖它的 ItemContainerGenerator 属性 以生成您的 MyTabItem 类型而不是它自己的类型。不幸的是,如果不进行子类化,您将无法做到这一点。项目本身与 ItemsPanelTempalate 没有任何相似之处。

  2. 如果你绑定TabControl.ItemsSource到一个集合,重新排序选项卡控件中的子项的方法是重新排序绑定的集合,然后让TabControl处理更新 UI。实际的集合必须是 ObservableCollection 才能工作,但无论如何都应该如此。 TabControl.ItemsSource 的声明类型是 System.Collections.IEnumerable,但您可以在放置处理程序中将其转换为 System.Collections.IList,并使用它来重新排序集合。它会起作用,并且会发出适当的通知。

你可以轻松地做你想做的事。只需重写 GetContainerForItemOverride 方法,如下所示

public class TabControlEx : TabControl
{

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TabItemEx();
    }
}