我目前正在测试AvalonDock。我想通过MVVM创建布局。
我遇到问题,设计师会显示锚点(不是文档)的数据绑定标题,但在运行程序时会丢失。
我找到this example并重新创建了一个更简单的版本来重现问题。
这是我做的:
创建了这个非常简单的viewmodel:
namespace NonWorkingAvalonDock {
public sealed class MainViewModel {
public MainViewModel() {
Pages = new SimplePageViewModel[] {
new SimplePageViewModel("Foo"),
new SimplePageViewModel("Bar")
};
}
public SimplePageViewModel[] Pages { get; }
}
public sealed class SimplePageViewModel {
public SimplePageViewModel(string title) {
Title = title;
}
public string Title { get; }
}
}
让我的XAML看起来像这样:
<Window x:Class="NonWorkingAvalonDock.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NonWorkingAvalonDock"
xmlns:dock="http://schemas.xceed.com/wpf/xaml/avalondock"
xmlns:dockctrl="clr-namespace:Xceed.Wpf.AvalonDock.Controls;assembly=Xceed.Wpf.AvalonDock"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:MainViewModel x:Key="ViewModel" />
</Window.Resources>
<dock:DockingManager DataContext="{StaticResource ViewModel}" AnchorablesSource="{Binding Pages}" >
<dock:DockingManager.LayoutItemContainerStyle>
<!-- you can add additional bindings from the layoutitem to the DockWindowViewModel -->
<Style TargetType="{x:Type dockctrl:LayoutItem}" >
<Setter Property="Title" Value="{Binding Model.Title}" />
</Style>
</dock:DockingManager.LayoutItemContainerStyle>
</dock:DockingManager>
</Window>
现在,在Expression blend中,这看起来是正确的:
但是当我运行我的应用程序时,我得到了这个:
我想我错过了一些东西,但我无法弄清楚是什么,因为来自github的例子运行得很好。
我对示例和我的代码进行了更多调查,并且在示例中,作者在代码中设置了数据上下文。当我这样做时,它也适用于我。
此外,我做了以下实验:我将Pages
属性设为私有可写,并使用null
对其进行初始化,并使用Timer
在一秒钟后设置视图模型。当我这样做时,我也得到了标题。