AvalonDock 3:可锚定的数据绑定标题显示在设计器中,但在运行程序

时间:2017-01-18 18:01:17

标签: c# wpf mvvm avalondock

我目前正在测试AvalonDock。我想通过MVVM创建布局。

我遇到问题,设计师会显示锚点(不是文档)的数据绑定标题,但在运行程序时会丢失。

我找到this example并重新创建了一个更简单的版本来重现问题。

这是我做的:

  1. 使用
  2. 中的WPF应用程序创建了一个空白解决方案
  3. 通过Nuget
  4. 添加了Xceed WPF Toolkit v3.0
  5. 创建了这个非常简单的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; }
        }
    }
    
  6. 让我的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>
    
  7. 现在,在Expression blend中,这看起来是正确的:

    Main window in designer

    但是当我运行我的应用程序时,我得到了这个:

    enter image description here

    我想我错过了一些东西,但我无法弄清楚是什么,因为来自github的例子运行得很好。

    跟进:

    我对示例和我的代码进行了更多调查,并且在示例中,作者在代码中设置了数据上下文。当我这样做时,它也适用于我。

    此外,我做了以下实验:我将Pages属性设为私有可写,并使用null对其进行初始化,并使用Timer在一秒钟后设置视图模型。当我这样做时,我也得到了标题。

0 个答案:

没有答案