如何更改TabControl的默认ItemContainerStyle?

时间:2019-12-23 01:24:52

标签: wpf datatemplate tabitem

我的英语能力很差,因为我不会说英语。 希望您能理解。

根据TabControl的定义,TabControl将TabItem作为ItemContainerStyle。

[StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(TabItem))]
[TemplatePart(Name = "PART_SelectedContentHost", Type = typeof(ContentPresenter))]
public class TabControl : Selector

我有TabControl和TabItem的DataTemplate。 我的DataTemplate定义如下。

<DataTemplate DataType="{x:Type documentViewModels:ParsingHistoryViewModel}">
    <advanceControls:ClosableTabItem Header="test">
        <DataGrid IsReadOnly="True" ItemsSource="{Binding ParsingHistory}"/>
    </advanceControls:ClosableTabItem>
</DataTemplate>

TabControl在MainWindow中定义。 TabControl的ItemsSource是Documents。 下面的代码显示了这一点。

<Window>
    <TabControl Grid.Row="1" x:Name="tabControl"
                        ItemsSource="{Binding Documents}"/>
</Window>

MinWindow使用MainViewModel。 MainViewModel具有绑定到TabControl的文档。

private ObservableCollection<DocumentViewModel> _documents;
public ObservableCollection<DocumentViewModel> Documents
{
    get
    {
        if (this._documents == null)
        {
            this._documents = new ObservableCollection<DocumentViewModel>();
            this._documents.CollectionChanged += _documents_CollectionChanged;
        }

        return this._documents;
    }
}

将ParsingHistoryViewModel添加到OnDocumentCreate函数中的文档中,该函数在单击该按钮时被调用。该代码如下所示。 (ParsingHistoryViewModel派生自DocumentViewModel)

private void OnDocumentCreate(object sender, Document e)
{
    var mainVm = this.mainWindow.DataContext as MainViewModel;

    var newDocument = new ParsingHistoryViewModel();
    mainVm.Documents.Add(newDocument);
}

当我单击按钮时,称为OnDocumentCreate函数,在该函数中,将创建ParsingHistoryViewModel并将其添加到MainViewModel的文档中。

创建ParsingHistoryViewModel时,将执行以下逻辑。

<DataTemplate DataType="{x:Type documentViewModels:ParsingHistoryViewModel}">
    <advanceControls:ClosableTabItem Header="test">
        <DataGrid IsReadOnly="True" ItemsSource="{Binding ParsingHistory}"/>
    </advanceControls:ClosableTabItem>
</DataTemplate>

上述逻辑被包装到TabItem中,因为TabItem是TabControl的默认ItemContainerStyle。

结果如下所示。

<TabControl>
    <TabItem>
        <advanceControls:ClosableTabItem Header="test">
            <DataGrid IsReadOnly="True" ItemsSource="{Binding ParsingHistory}"/>
        </advanceControls:ClosableTabItem>
    </TabItem>
</TabControl>

这不是我想要的。我想要的形状如下。

<TabControl>
    <advanceControls:ClosableTabItem Header="test">
        <DataGrid IsReadOnly="True" ItemsSource="{Binding ParsingHistory}"/>
    </advanceControls:ClosableTabItem>
</TabControl>

我应该怎么做才能实现这个目标? 希望您的帮助。

感谢您阅读。

0 个答案:

没有答案