AvalonDock 绑定在 DocumentHeaderTemplate 中不起作用

AvalonDock binding not working in DocumentHeaderTemplate

我将 ViewModel(xaml 中的项目)绑定到 AvalonDock,一切正常,但在一种情况下失败了。

LayoutItemTemplate 工作正常并且 <v:CameraItemView />(我的 UserControl)的 DataContext 使用 ViewModel 设置。

<ad:DockingManager x:Name="dockManager" 
                   DocumentsSource="{Binding Path=Items}"
                   ActiveContent="{Binding Path=CurrentItem, Mode=TwoWay}">
        <ad:DockingManager.LayoutItemTemplate>
            <DataTemplate>
                <v:CameraItemView />                     
            </DataTemplate>                
        </ad:DockingManager.LayoutItemTemplate>               
        <ad:DockingManager.DocumentHeaderTemplate>                
            <DataTemplate>
                <Label Content="{Binding Name}" />
            </DataTemplate>
        </ad:DockingManager.DocumentHeaderTemplate>  
</ad:DockingManager>   

问题出在 DocumentHeaderTemplate,当我用静态文本填充 Content 时它显示正确,当只留下 <Label Content="{Binding}" /> 时它显示 Xceed.Wpf.AvalonDock.Layout.LayoutDocument

Window 的

MainViewModel 包含:

private ObservableCollection<CameraItemViewModel> items;
public ObservableCollection<CameraItemViewModel> Items
{
    get { return items; }
    set
    {
        if (items != value)
        {
            items = value;
            NotifyPropertyChanged("Items");
        }
    }
}

private CameraItemViewModel currentItem;
public CameraItemViewModel CurrentItem
{
    get { return currentItem; }
    set
    {
        if (currentItem != value)
        {
            currentItem = value;
            NotifyPropertyChanged("CurrentItem");
        }
    }
}

属性 在 CameraItemViewModel

private string name;
public string Name
{
    get { return name; }
    set
    {
        if (name != value)
        {
            name = value;
            NotifyPropertyChanged("Name");
        }
    }
}

当我在 UserControl <v:CameraItemView /> 中使用这个 属性 Name 时,它起作用了。

是否有可能访问 collection 的项目?

我的解决方案:

在路径的开头添加了 Content,因为 ViewModel 存储在 LayoutDocumentContent 中。

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

我已经通过下面的操作解决了这个问题,

DocumentHeaderTemplate

  <xcad:DockingManager.DocumentHeaderTemplate>
             <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Content.DocumentPath}" />
                </StackPanel>
            </DataTemplate>
  </xcad:DockingManager.DocumentHeaderTemplate>

Resources

<xcad:DockingManager.Resources>
   <DataTemplate  DataType="{x:Type ViewModels:DocumentViewModel}">
      <Views:DocumentView DataContext="{Binding}" DocumentPath="{Binding DocumentPath}" />
   </DataTemplate>
</xcad:DockingManager.Resources>

LayoutDocumentPaneGroup

  <xcad:LayoutDocumentPaneGroup>
      <xcad:LayoutDocumentPane/>
  </xcad:LayoutDocumentPaneGroup>

ViewModel

public class DocumentViewModel 
{
    private string documentPath;
    public string DocumentPath
    {
        get { return documentPath; }
        set { SetProperty(ref documentPath, value); }
    }
}

尝试在 binding 中添加 Content.Name 我相信会解决您的问题。让我知道它是否有效。