0

This is a newbie question about using Avalon Dock and Caliburn.Micro together. First I got a simple example of Caliburn.Micro working, taken from the Mindscape blog's excellent tutorial on Caliburn Micro. This example consists of a main window called 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>

where ColorView is made of three radio buttons:

<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>

The class behind MainShellView has a Color property:

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

and Caliburn.Micro sets the color of the rectangle on the right in MainShellView to the color selected by the radio buttons:

 [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 */ }

  }

I then tried replacing the Grid in the MainShellView by an AvalonDock layout, with the ColorView in one document and the colored rectangle in another document:

<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>

However the ColorView doesn't appear on the left hand side. The Caliburn binding also fails - stepping through the Caliburn source code, this is because the VisualTreeHelper can't see the ColorView.

avalon_example

I've abbreviated the source code above, and put the full source in https://github.com/BobMortimer/SO_Question1 .

I'm certainly doing something stupid. So why is this not working, and how can I fix it?

Bob Mortimer
  • 439
  • 7
  • 17

1 Answers1

0

I think you are missing 2 overrides in bootstrapper for

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

and

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

surprisingly enough it ran but didn't do what it was suppose to based on the source you provided in github. As you said on the debugger it dies, was it IoC not Initialized?

slavoo
  • 5,798
  • 64
  • 37
  • 39
mvermef
  • 3,814
  • 1
  • 23
  • 36