WPF AvalonDock添加文档

Pit*_*k76 2 c# wpf user-controls mvvm avalondock

我有一个带AvalonDock的窗口.在启动时,打开了一个Document,其中填充了LocControllers usercontrols(LocControllersViewModel).

现在我希望在LocController上双击一个LocController用户控件在新Document中打开时.因此,第一个文档始终是概述,填充了LocController用户控件,双击后添加了其他文档.

我查看了AvalonDock和MVVM示例,但我无法弄清楚如何获得我想要的行为.

到目前为止我发现的是我必须使用DocumentsSource属性来绑定文档.所以我想我需要创建一个DocumentViewModels集合来绑定到DocumentsSource属性.我需要用Documentcontrols填充DocumentViewModel.对于第一个Document,将是一个LocController用户控件的列表,对于其他Documents,它可以是其他用户控件.

任何人都可以为我提供一个小代码示例吗?我不认为这很难,但我只是找不到它:(

编辑:这是我目前的DockingManager XAML:

    <Window x:Class="AvalonDockMvvmTest.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
                xmlns:AvalonDockMvvmTest="clr-namespace:AvalonDockMvvmTest"
                Title="MainWindow"
                Height="350"
                Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Menu>
            <MenuItem Header="File">
                <MenuItem Header="NewDetail"
                                    Command="{Binding NewCommand}" />
                <MenuItem Header="OpenSelectDetail"
                                    Command="{Binding OpenCommand}" />
            </MenuItem>
        </Menu>

        <xcad:DockingManager x:Name="DockManager"
                                                 Margin="3 0 3 0"
                                                 DocumentsSource="{Binding Documents, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

            <xcad:DockingManager.LayoutItemTemplateSelector>
                <AvalonDockMvvmTest:PanesTemplateSelector>
                    <AvalonDockMvvmTest:PanesTemplateSelector.OverViewTemplate>
                        <DataTemplate DataType="{x:Type AvalonDockMvvmTest:OverviewViewModel}"> <!-- Overview user control -->
                        </DataTemplate>
                    </AvalonDockMvvmTest:PanesTemplateSelector.OverViewTemplate>

                    <AvalonDockMvvmTest:PanesTemplateSelector.DetailTemplate>
                        <DataTemplate DataType="{x:Type AvalonDockMvvmTest:DetailViewModel}"> <!-- Detail user control -->
                        </DataTemplate>
                    </AvalonDockMvvmTest:PanesTemplateSelector.DetailTemplate>

                </AvalonDockMvvmTest:PanesTemplateSelector>
            </xcad:DockingManager.LayoutItemTemplateSelector>
        </xcad:DockingManager>

    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

那么如何将不同的控件(概述和细节)加载到文档窗格?

Pit*_*k76 5

好吧,我花了一些时间,但我终于以我想要的方式工作了.从AvalonDock MMVM示例和CodeProject的'AvalonDock [2.0]教程中挑选代码

结果:当应用程序启动时,概述将加载到第一个文档选项卡中.单击newdetail菜单项时,将在概览选项卡后添加新文档选项卡.概述选项卡设置为无法关闭.

还有一些事情要做,比如添加侧面和底部面板.所以我还没有完成,但我想如果我到目前为止其他面板也可以完成.

截图:

AvalonDock MVVM

在此输入图像描述

XAML:

<Window x:Class="AvalonDockMvvmTest.View.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
                xmlns:Pane="clr-namespace:AvalonDockMvvmTest.View.Pane"
                xmlns:ViewModel="clr-namespace:AvalonDockMvvmTest.ViewModel"
                Title="MainWindow"
                Height="350"
                Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <!-- Region Menu-->
        <Menu>
            <MenuItem Header="File">
                <MenuItem Header="NewDetail"
                                    Command="{Binding NewCommand}" />
                <MenuItem Header="OpenSelectDetail"
                                    Command="{Binding OpenCommand}" />
            </MenuItem>
        </Menu>
        <!-- EndRegion Menu-->

        <!-- Region DockingManager -->
        <xcad:DockingManager x:Name="DockManager"
                                                 Margin="3 0 3 0"
                                                 DocumentsSource="{Binding Files}"
                                                 Grid.Row="1">

            <xcad:DockingManager.LayoutItemTemplateSelector>
                <Pane:PanesTemplateSelector>
                    <!-- Overview (startpage)-->
                    <Pane:PanesTemplateSelector.OverViewTemplate>
                        <DataTemplate DataType="{x:Type ViewModel:OverviewViewModel}">
                            <!-- Add UserControl here-->
                            <TextBox Text="{Binding ContentText}"/>
                        </DataTemplate>
                    </Pane:PanesTemplateSelector.OverViewTemplate>

                    <!--Detail controls-->
                    <Pane:PanesTemplateSelector.DetailTemplate>
                        <DataTemplate DataType="{x:Type ViewModel:DetailViewModel}">
                            <!-- Add UserControl here-->
                            <TextBox Text="{Binding ContentText}" />
                        </DataTemplate>
                    </Pane:PanesTemplateSelector.DetailTemplate>
                </Pane:PanesTemplateSelector>
            </xcad:DockingManager.LayoutItemTemplateSelector>

            <xcad:DockingManager.LayoutItemContainerStyleSelector>
                <Pane:PanesStyleSelector>
                    <!-- Overview (startpage) style -->
                    <Pane:PanesStyleSelector.OverviewStyle>
                        <Style TargetType="{x:Type xcad:LayoutItem}">
                            <Setter Property="Title"
                                            Value="{Binding Model.Title}" />
                            <Setter Property="ToolTip"
                                            Value="{Binding Model.Title}" />
                            <Setter Property="CloseCommand"
                                            Value="{Binding Model.CloseCommand}" />
                            <Setter Property="ContentId"
                                            Value="{Binding Model.ContentId}" />
                        </Style>
                    </Pane:PanesStyleSelector.OverviewStyle>
                    <!-- Detail style -->
                    <Pane:PanesStyleSelector.DetailStyle>
                        <Style TargetType="{x:Type xcad:LayoutItem}">
                            <Setter Property="Title"
                                            Value="{Binding Model.Title}" />
                            <Setter Property="ToolTip"
                                            Value="{Binding Model.Title}" />
                            <Setter Property="ContentId"
                                            Value="{Binding Model.ContentId}" />
                        </Style>
                    </Pane:PanesStyleSelector.DetailStyle>
                </Pane:PanesStyleSelector>
            </xcad:DockingManager.LayoutItemContainerStyleSelector>
        </xcad:DockingManager>
        <!-- EndRegion DockingManager -->
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)