这是关于一起使用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。
我缩写了上面的源代码,并将完整的源代码放在https://github.com/BobMortimer/SO_Question1。
我当然做了些蠢事。那么为什么这不起作用,我该如何解决呢?
答案 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没有初始化?