2014-01-09 55 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?