绑定 AvalonDock 2.0 中集合中的布局文档的标题

本文关键字:布局 文档 标题 AvalonDock 集合 绑定 | 更新日期: 2023-09-27 18:33:35

我正在将 ObservableCollection 绑定到 AvalonDock 2.0,其中集合中的每个项目都是 AvalonDock 文档。这就是我进行绑定的方式:

<ad:DockingManager DocumentsSource="{Binding Path=OpenProjects, Mode=TwoWay}" ActiveContent="{Binding Path=CurrentProject, Mode=TwoWay}" LayoutItemTemplateSelector="{StaticResource ProjectTemplateSelector}">
...
</ad:DockingManager>

问题是我想显示每个项目的名称(在属性Name中指定 CurrentProject )作为文档标题。这是我尝试过的:

<ad:DockingManager.DocumentHeaderTemplate>
    <DataTemplate>
        <TextBlock DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ad:DockingManager}, Path=ActiveContent, Mode=OneWay}" Text="{Binding Path=Name}" />
    </DataTemplate>
</ad:DockingManager.DocumentHeaderTemplate>

如果我只打开一个文档,这很好用,但是当我有几个文档时,它们都显示当前项目的Name。例如,如果我有四个打开的项目,名称为"A"、"B"、"C"和"D",如果我当前正在查看文档"C",则所有四个选项卡将显示标题"C",当我更改为文档"B"时,它们都会将其名称更改为"B"。

有什么方法可以防止这种变化吗?我尝试将绑定模式设置为 OneTime ,但它似乎不起作用。

绑定 AvalonDock 2.0 中集合中的布局文档的标题

我最终所做的就是这样简单:

<ad:DockingManager.DocumentHeaderTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Content.Name}" />
    </DataTemplate>
</ad:DockingManager.DocumentHeaderTemplate>

说明:DocumentHeaderTemplate 中绑定的 DataContext 是 LayoutDocument 本身。事实证明,它有一个名为 Content 的属性,它表示每个文档中的解绑定对象(在本例中为我的 OpenProjects 集合中的每个项目)。在该对象中,我有属性 Name,它是我要用于标题的字符串。

这是因为您将标题文本绑定到通过停靠管理器的ActiveContent引用的对象的属性。很明显,更改ActiveContent(焦点文档)会将所有LayoutDocument视图的标题更新为相同的值,因为所有标题都绑定到同一源。

你可以尝试这样的事情:

<ad:DockingManager.DocumentHeaderTemplate>
    <DataTemplate>
        <Border x:Name="Header">
            <ad:AnchorablePaneTitle Model="{Binding Model, RelativeSource={RelativeSource TemplatedParent}}"/>
        </Border>
    </DataTemplate>
</ad:DockingManager.DocumentHeaderTemplate>