2016-01-01 63 views
0

我試圖將AvalonDock 2.8與Caliburn Micro 2.0.2一起使用。以下是我目前有:與Caliburn Micro一起使用AvalonDock

MainView.xaml:

<Window x:Class="MainView" 
     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:cal="http://www.caliburnproject.org" 
     xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock" 
     xmlns:local="clr-namespace:CaliburnMicroAndAvalonDock" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="40"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Button x:Name="Open" Content="Open new document" Margin="5"/> 

     <xcad:DockingManager Grid.Row="1" DocumentsSource="{Binding Items}"> 
      <xcad:DockingManager.LayoutItemContainerStyle> 
       <Style TargetType="{x:Type xcad:LayoutItem}"> 
        <Setter Property="Title" Value="{Binding Model.DisplayName}" /> 
       </Style> 
      </xcad:DockingManager.LayoutItemContainerStyle> 

      <xcad:DockingManager.LayoutItemTemplateSelector> 
       <local:LayoutItemTemplateSelector> 
        <local:LayoutItemTemplateSelector.Template> 
         <DataTemplate> 
          <ContentControl cal:View.Model="{Binding .}" IsTabStop="False"/> 
         </DataTemplate> 
        </local:LayoutItemTemplateSelector.Template> 
       </local:LayoutItemTemplateSelector> 
      </xcad:DockingManager.LayoutItemTemplateSelector> 

      <xcad:LayoutRoot> 
       <xcad:LayoutPanel Orientation="Horizontal"> 
        <xcad:LayoutDocumentPane/> 
       </xcad:LayoutPanel> 
      </xcad:LayoutRoot> 
     </xcad:DockingManager> 
    </Grid> 
</Window> 

MainViewModel.vb:

Imports Caliburn.Micro 

Public Class MainViewModel 
    Inherits Conductor(Of Screen).Collection.OneActive 

    Private m_Index As Int32 = 0 

    Sub Open() 
    ActivateItem(New DocumentViewModel With {.DisplayName = $"Document {m_Index}"}) 
    m_Index += 1 
    End Sub 

End Class 

Document.xaml:

<UserControl x:Class="DocumentView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:CaliburnMicroAndAvalonDock" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBlock Text="{Binding DisplayName}"/> 
    </Grid> 
</UserControl> 

DocumentViewModel.vb:

Imports Caliburn.Micro 

Public Class DocumentViewModel 
    Inherits Screen 

End Class 

LayoutItemTemplateSelector.vb:

Public Class LayoutItemTemplateSelector 
    Inherits DataTemplateSelector 

    Public Property Template As DataTemplate 

    Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate 
    Return Me.Template 
    End Function 

End Class 

部分它的工作原理,問題是,鑑於失敗Cannot find view for System.Windows.Controls.ContentPresenter錯誤加載:

Error

我很新的這兩個卡利Micro和AvalonDock,所以我的代碼很大程度上基於我在網上找到的例子(例如this)。但這些樣本相當陳舊,並且不適用於當前版本的AvalonDock(2.8.15465.16500)。如果我切換到較舊的(2.0.2000),它工作正常。

回答

2

我設法解決這個問題的幫助this answerthis explanation。 這是更新的代碼LayoutItemTemplateSelector.vb:

Public Class LayoutItemTemplateSelector 
    Inherits DataTemplateSelector 

    Public Property Template As DataTemplate 

    Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate 
    If TypeOf item Is DocumentViewModel Then 
     Return Me.Template 
    Else 
     Return MyBase.SelectTemplate(item, container) 
    End If 
    End Function 

End Class