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

C# 如何在TabControl模板中使用自定义TabItem?,c#,wpf,mvvm,custom-controls,caliburn.micro,C#,Wpf,Mvvm,Custom Controls,Caliburn.micro,我在自定义控件库中有一个CustomTabItem。当我在xaml或代码中显式使用它时,它是有效的。当我使用绑定到ViewModel(CaliburnMicro)而不是我的控件时,会使用标准的TabItem。如何指定在xaml中使用CustomTabItem 我试图指定DataType=“{x:Type adc:ActorTabItem}”-不起作用 我试图指定DataType=“{x:Type adc:CustomTabItem}”-不起作用 这里有两件事: 您需要子类化TabControl并

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

我试图指定
DataType=“{x:Type adc:CustomTabItem}”
-不起作用


这里有两件事:

  • 您需要子类化
    TabControl
    并重写其属性以生成您的
    MyTabItem
    类型,而不是它自己的类型。不幸的是,如果不进行子类化,就无法做到这一点。对于项目本身,
    itemspaneltemplate
    ,没有什么值得分析的

  • 如果要将
    TabControl.ItemsSource
    绑定到集合,则对选项卡控件中的子项重新排序的方法是对绑定的集合重新排序,然后让
    TabControl
    处理更新UI的操作。实际收集必须是一个
    可观察收集
    ,才能工作,但无论如何都应该如此。声明的
    TabControl.ItemsSource
    类型为
    System.Collections.IEnumerable
    ,但您可以将其强制转换到拖放处理程序中的
    System.Collections.IList
    ,并使用该类型对集合进行重新排序。它将起作用,并将发出相应的通知


  • 这里有两件事:

  • 您需要子类化
    TabControl
    并重写其属性以生成您的
    MyTabItem
    类型,而不是它自己的类型。不幸的是,如果不进行子类化,就无法做到这一点。对于项目本身,
    itemspaneltemplate
    ,没有什么值得分析的

  • 如果要将
    TabControl.ItemsSource
    绑定到集合,则对选项卡控件中的子项重新排序的方法是对绑定的集合重新排序,然后让
    TabControl
    处理更新UI的操作。实际收集必须是一个
    可观察收集
    ,才能工作,但无论如何都应该如此。声明的
    TabControl.ItemsSource
    类型为
    System.Collections.IEnumerable
    ,但您可以将其强制转换到拖放处理程序中的
    System.Collections.IList
    ,并使用该类型对集合进行重新排序。它将起作用,并将发出相应的通知


  • 你可以很容易地做你想做的事。只需按如下方式重写该方法

    public class TabControlEx : TabControl
    {
    
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new TabItemEx();
        }
    }
    

    你可以很容易地做你想做的事。只需按如下方式重写该方法

    public class TabControlEx : TabControl
    {
    
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new TabItemEx();
        }
    }
    

    您可能需要对TabControl进行子类化并重写其,以返回您自己的ItemContainerGenerator对象,该对象创建子类的实例。不幸的是,WPF似乎没有提供一种在不子类化父对象的情况下插入该组件的方法(ListBox、ItemsControl等也是如此)。谢谢。考虑ItemContainerGenerator属性的内部以及ContainerFromItem(对象)和ContainerFromIndex(Int32)方法。在公共机制中,不引用类TabItem。更改并没有成为此属性。该路径引导我找到了TabControl类的GetContainerForItemOverride和IsItemItsOwnContainerOverride方法。我在子类中重新定义了这些方法,得到了一个积极的结果。下面是代码:protected override bool IsItemTownContainerOverride(对象项){return(项为ActorTabItem);}protected override DependencyObject GetContainerForItemOverride(){return new ActorTabItem();}下一步,我遇到了另一个问题,CustomTabItem没有父项,而TabControl的子项(项)有一个视图模型。但如果我不作决定,那将是另一个问题。1)请在问题中添加您的类,这样我就可以了解家长的事情是怎么回事。2) 拥有viewmodel的儿童不应该是一个问题(除了)。为什么您认为viewmodel是一个问题?您可能需要对TabControl进行子类化并重写其,以返回您自己的ItemContainerGenerator对象,该对象创建子类的实例。不幸的是,WPF似乎没有提供一种在不子类化父对象的情况下插入该组件的方法(ListBox、ItemsControl等也是如此)。谢谢。考虑ItemContainerGenerator属性的内部以及ContainerFromItem(对象)和ContainerFromIndex(Int32)方法。在公共机制中,不引用类TabItem。更改并没有成为此属性。该路径引导我找到了TabControl类的GetContainerForItemOverride和IsItemItsOwnContainerOverride方法。我在子类中重新定义了这些方法,得到了一个积极的结果。下面是代码:protected override bool IsItemTownContainerOverride(对象项){return(项为ActorTabItem);}protected override DependencyObject GetContainerForItemOverride(){return new ActorTabItem();}下一步,我遇到了另一个问题,CustomTabItem没有父项,而TabControl的子项(项)有一个视图模型。但如果我不作决定,那将是另一个问题。1)请在问题中添加您的类,这样我就可以了解家长的事情是怎么回事。2) 拥有viewmodel的儿童不应该是一个问题(除了)。为什么你认为viewmodel是个问题?是的,我做了,而且成功了。为了完整性,我还重新定义了lang csharp protected override bool IsItemItsOwnContainerOverride(object item)=>item为TabItemEx是的,我做到了,而且成功了。为了完整性,我还重新定义了