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
存储在 LayoutDocument
的 Content
中。
<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
我相信会解决您的问题。让我知道它是否有效。
我将 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
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
存储在 LayoutDocument
的 Content
中。
<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
我相信会解决您的问题。让我知道它是否有效。