从AvalonDock 2.0中的集合绑定LayoutDocument的标题

时间:2014-12-09 08:42:23

标签: c# wpf mvvm avalondock

我将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,但它似乎不起作用。

2 个答案:

答案 0 :(得分:15)

我最终做的事情就像这样简单:

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

说明: DocumentHeaderTemplate内部绑定的DataContext是LayoutDocument本身。事实证明它有一个名为Content的属性,它代表每个文档中的de binding对象(在本例中,我的OpenProjects集合中的每个Project)。在那个对象中,我有了属性Name,这是我想用于标题的字符串。

答案 1 :(得分:2)

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

您可以尝试这样的事情:

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