【发布时间】:2019-09-26 14:26:14
【问题描述】:
我在自定义控件库中有一个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 并覆盖其
ItemContainerGeneratorproperty,以返回您自己的 ItemContainerGenerator 对象,该对象创建您的子类的实例。不幸的是,WPF 似乎没有提供一种在不继承父类的情况下插入它的方法(ListBox、ItemsControl 等也是如此)。 -
谢谢。考虑 ItemContainerGenerator 属性的内部以及方法 ContainerFromItem (Object) 和 ContainerFromIndex (Int32)。里面有一个通用的机制,没有引用 TabItem 类。变化没有变成这个属性。这条路径将我引向 TabControl 类的 GetContainerForItemOverride 和 IsItemItsOwnContainerOverride 方法。我在子类中重新定义了这些方法,并收到了肯定的结果。下面是代码:
-
protected override bool IsItemItsOwnContainerOverride(object item) { return (item is ActorTabItem); } 受保护的覆盖 DependencyObject GetContainerForItemOverride() { return new ActorTabItem(); }
-
接下来,我遇到了另一个问题,我的 CustomTabItem 没有父级,而 TabControl 的子级(项目)有一个视图模型。但如果我不决定,那就是另一个问题了。
-
1) 请将您的课程添加到您的问题中,这样我就可以弄清楚父母的事情是什么。 2) 拥有视图模型的孩子根本不应该成为问题(this issue that you may not have run into yet 除外)。为什么你认为视图模型是个问题?
标签: c# wpf mvvm custom-controls caliburn.micro