AvalonDock绑定在DocumentHeaderTemplate

时间:2015-08-19 07:50:18

标签: c# wpf xaml mvvm avalondock

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

LayoutItemTemplate正常工作,DataContext {我的UserControl}的<v:CameraItemView />是使用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 Name中使用此属性<v:CameraItemView />时,它可以正常工作。

是否有可能访问收集项目?

我的解决方案:

在路径开头添加了Content,因为ViewModel存储在Content的{​​{1}}中。

LayoutDocument

1 个答案:

答案 0 :(得分:4)

我已经通过以下方式解决了这个问题,

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); }
    }
}

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