2014-01-09 122 views
2

我有一个窗口与AvalonDock。在启动时会打开一个充满LocControllers usercontrols(LocControllersViewModel)的Document。WPF AvalonDock添加文档

现在,我想要在LocController中的LocaleController上双击某个新文档中的LocController用户控件。因此,第一个文档始终是概述,充满LocController usercontrols,其他文档在双击后添加。

我已经看过AvalonDock和MVVM示例,但我无法弄清楚如何获得我想要的行为。

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

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

编辑:这是我目前的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> 

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

+0

我会尽量简化我的问题。我有几个不同的用户控件,比如overviewControl,detailControl等。现在我想在第一个DocumentTab中启动overviewControl。如果在overviewControl中双击某个项目,则需要在新的DocumentTab上打开detailControl。我怎样才能做到这一点?我不会那么认真。 – PitAttack76

回答

5

好吧,我花了一些时间,但我终于得到了它的工作就是我想要的。 从AvalonDock MMVM样本采摘代码和CodeProject上“AvalonDock [2.0]教程”

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

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

截图:

AvalonDock MVVM

enter image description here

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> 
1

哪里是你的NewCommand的定义是什么?我原以为这个问题的答案主要在于该命令定义中包含的内容,而不仅仅是如何连接XAML?