2014-01-09 3 views
2

У меня есть окно с AvalonDock. При запуске открывается один документ, который заполняется с помощью пользовательских контролей LocControllers (LocControllersViewModel).WPF AvalonDock добавить документы

Теперь я хочу иметь это, когда в LocController есть двойной клик, который пользовательский контроль LocController открывается в новом документе. Таким образом, первым документом всегда является обзор, заполненный пользовательскими элементами LocController, а остальные документы добавляются после двойного щелчка.

Я просмотрел образец AvalonDock и MVVM, но не могу понять, как получить то поведение, которое я хочу.

Что я обнаружил до сих пор, так это то, что я должен использовать свойство DocumentsSource для привязки документов. Поэтому я предполагаю, что мне нужно создать коллекцию DocumentViewModels для привязки к свойству DocumentsSource. Этот DocumentViewModel Мне нужно заполнить usercontrols. Для первого документа будет список пользовательских элементов LocController, для других документов это могут быть другие пользовательские элементы управления.

Может ли кто-нибудь предоставить мне небольшой пример кода? я не думаю, что это то, что трудно, но я просто не могу найти :(

EDIT: Вот мой текущий 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 и т. Д. Теперь я хочу загрузить OverviewControl при запуске в первом DocumentTab. Если в объекте overviewControl дважды щелкнуть по элементу, ему необходимо открыть detailControl на новом DocumentTab. Как я могу это сделать? Это не может быть так сложно, я бы подумал. – PitAttack76

ответ

5

Хорошо, что мне потребовалось некоторое время, но я, наконец, получил это работает так, как я хочу. Выбор кода из образца AvalonDock MMVM и в Codeproject «AvalonDock [2,0] Учебное пособие»

Результат: когда приложение запускает обзор загружается на вкладку первого документа. Когда вы нажимаете элемент меню newdetail, после вкладки «Обзор» добавляется вкладка «Новый документ». Вкладка «Обзор» не может быть закрыта.

Есть еще несколько вещей, таких как добавление боковой и нижней панели. Так что я еще не закончил, но я думаю, что если бы я дошел до этого, другие панели тоже можно было бы сделать.

Скриншот:

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?

Смежные вопросы