如何在 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>
这里发生了两件事:
您需要继承 TabControl
并覆盖它的 ItemContainerGenerator
属性 以生成您的 MyTabItem
类型而不是它自己的类型。不幸的是,如果不进行子类化,您将无法做到这一点。项目本身与 ItemsPanelTempalate
没有任何相似之处。
如果你绑定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();
}
}
我在自定义控件库中有一个 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>
这里发生了两件事:
您需要继承
TabControl
并覆盖它的ItemContainerGenerator
属性 以生成您的MyTabItem
类型而不是它自己的类型。不幸的是,如果不进行子类化,您将无法做到这一点。项目本身与ItemsPanelTempalate
没有任何相似之处。如果你绑定
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();
}
}