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

时间:2019-05-08 19:26:34

标签: c# wpf mvvm custom-controls caliburn.micro

我在自定义控件库中有一个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>

2 个答案:

答案 0 :(得分:0)

您在这里发生了两件事:

  1. 您需要继承TabControl的子类并覆盖其ItemContainerGenerator属性,以生成您的MyTabItem类型而不是其自身类型。不幸的是,没有子类就无法做到这一点。 ItemsPanelTempalate与项目本身没有什么相似之处。

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

答案 1 :(得分:0)

您可以轻松完成自己想做的事情。只需按照以下方法覆盖GetContainerForItemOverride方法

public class TabControlEx : TabControl
{

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