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代码>是的,我做到了,而且成功了。为了完整性,我还重新定义了