所以在Caliburn Micro中,我一直在使用以下方法在另一个视图中组成视图:
查看:
<UserControl x:Class="MyProject.MyComposingView"
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">
<ContentControl x:Name="MyComposedViewModel"/>
</UserControl>
视图模型:
class ComposingViewModel : PropertyChangedBase
{
private ComposedViewModel _myComposedViewModel;
public ComposedViewModel MyComposedViewModel
{
get { return _myComposedViewModel; }
set
{
_myComposedViewModel= value;
NotifyOfPropertyChange(() => Page);
}
}
public ComposingViewModel(ComposedViewModel myComposedViewModel)
{
MyComposedViewModel = myComposedViewModel;
}
}
Caliburn Micro自动发现,因为它是一个ContentControl,它显然不想绑定到ViewModel,而是绑定到它的相关View,因此它可以做一些事情来绑定ContentControl&# 39; s Content属性为MyComposedView而不是MyComposedViewModel。
但是,如果我不想使用ContentControl怎么办?比如,也许我的一些可重用的自定义组件包含了ContentControl?例如:
<UserControl x:Class="MyProject.MyContentWrapper"
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"
mc:Ignorable="d">
<Grid x:Name="PreviewBox" SizeChanged="onSizeChanged">
<Image x:Name="BGImage" Source="{Binding BGImage}"/>
<ContentControl Content="{Binding}"/>
</Grid>
</UserControl>
如果我用MyContentWrapper替换ContentControl,CaliburnMicro将不再适用于提供MyComposedView,并且我最终得到了一个名为MyProject.MyComposedViewModel
的TextBlock。
我怎样才能让CaliburnMicro知道它应该提供View而不是ViewModel呢?
答案 0 :(得分:0)
您要做的是为自定义控件添加约定:
AddElementConvention<ContentControl>
。 ConventionManager.AddElementConvention<YourControl>
类似的ContentControl
来电。 ContentPropertyAttribute
并指定content属性。 免责声明:我在移动设备上无法验证这一点。