Caliburn.Micro与AvalonDock无法正常工作的例子

时间:2015-02-24 15:28:45

标签: wpf caliburn.micro avalondock

这是关于一起使用Avalon Dock和Caliburn.Micro的新手问题。首先,我得到了一个Caliburn.Micro工作的简单示例,取自Mindscape博客的excellent tutorial on Caliburn Micro。此示例包含一个名为MainShellView的主窗口:

<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背后的类有一个Color属性:

  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中的Grid,一个文档中的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

我当然做了些蠢事。那么为什么这不起作用,我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

我认为你在

的bootstrapper中缺少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中提供的源代码没有做到这一点。正如你在调试器上所说它死了,是不是IoC没有初始化?