2015-02-24 111 views
0

这是关于一起使用Avalon Dock和Caliburn.Micro的新手问题。首先,我从Mindscape博客的excellent tutorial on Caliburn Micro获得了一个Caliburn.Micro工作的简单示例。这个例子由一个主窗口称为MainShellView的:Caliburn.Micro示例与AvalonDock不起作用

<UserControl x:Class="TestApp.MainShellView" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid Width="300" Height="300" Background="LightBlue"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <ContentControl Name="ColorModel" Margin="10"/> 
     <Rectangle Width="100" Height="100" Fill="{Binding Color}" Grid.Column="1"/> 
    </Grid> 
</UserControl> 

其中ColorView由三个单选按钮:

<UserControl x:Class="TestApp.ColorView"> 
    <Grid> 
     <RadioButton Name="Red" Content="Red" Foreground="White" 
      VerticalAlignment="Center" HorizontalAlignment="Center" /> 
     <RadioButton Name="Green" Content="Green" Foreground="White" 
      VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="1" /> 
     <RadioButton Name="Blue" Content="Blue" Foreground="White" 
      VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="2" /> 
    </Grid> 
</UserControl> 

背后MainShellView类有一个颜色属性:

public class MainShellViewModel : PropertyChangedBase, IHandle<ColorEvent> 
    { 
    public SolidColorBrush Color 
    { 
     get { ... } 
     set { ... } 
    } 
} 

和Caliburn.Micro将MainShellView中右侧矩形的颜色设置为单选按钮所选颜色:

[Export(typeof(ColorViewModel))] 
public class ColorViewModel 
    { 
    public void Red() 
    { 
     _events.PublishOnUIThread(new ColorEvent(new SolidColorBrush(Colors.Red))); 
    } 
    public void Green() { /* something similar */ } 
    public void Blue() { /* something similar */ } 

    } 

我又试图一个文档和其他文档的彩色矩形由AvalonDock布局取代了电网在MainShellView,与ColorView:

<UserControl x:Class="TestApp.MainShellView" 
      xmlns:local="clr-namespace:TestApp" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <avalon:DockingManager> 
     <avalon:LayoutRoot> 
      <avalon:LayoutPanel> 
       <avalon:LayoutDocumentPane> 
        <avalon:LayoutDocument Title="Document 1"> 
         <ContentControl Name="ColorModel"/> 
        </avalon:LayoutDocument> 
       </avalon:LayoutDocumentPane> 
       <avalon:LayoutDocumentPane> 
        <avalon:LayoutDocument Title="Document 2"> 
         <Rectangle Width="100" Height="100" Fill="{Binding Color}" Grid.Column="1"/> 
        </avalon:LayoutDocument> 
       </avalon:LayoutDocumentPane> 
      </avalon:LayoutPanel> 
     </avalon:LayoutRoot> 
    </avalon:DockingManager> 
</UserControl> 

然而ColorView并不左侧出现手边。 Caliburn绑定也失败 - 单步执行Caliburn源代码,这是因为VisualTreeHelper无法看到ColorView。

avalon_example

我缩写的源代码之上,并把完整的源代码中https://github.com/BobMortimer/SO_Question1

我当然在做一些愚蠢的事情。那么为什么这不起作用,我该如何解决?

回答

0

我认为你缺少的引导程序2只覆盖了

protected override IEnumerable<object> GetAllInstances(Type serviceType) 
{ 
    return container.GetExportedValues<object>(
       AttributedModelServices.GetContractName(serviceType)); 
} 

protected override void BuildUp(object instance) 
{ 
    container.SatisfyImportsOnce(instance); 
} 

令人惊讶的是它跑了,但没有做它根据你提供的来源是假设github上。正如你在调试器上所说的那样,它是不是被初始化了?

+0

我将不得不阅读关于IoC的一些信息,以了解这会带给我什么 – 2015-02-26 13:55:17