如何将 ContentControl 以外的其他组件绑定到 Caliburn Micro 中的视图
本文关键字:绑定 Caliburn Micro 视图 组件 其他 ContentControl | 更新日期: 2023-09-27 18:35:05
所以在Caliburn Micro中,我一直在使用以下方法在另一个视图中组合一个视图:
- 将内容控件放在撰写视图中。
- 在组合视图模型上创建一个属性,并为其分配组合视图模型
- 为 ContentControl 指定一个 x:Name 属性,该属性与组合视图模型上组合的 ViewModel 属性的名称匹配。
这样。。。
视图:
<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,而是绑定到它关联的视图,因此它在后台做了一些事情,将 ContentControl 的 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,我最终得到一个TextBlock,上面写着,MyProject.MyComposedViewModel
。
我怎样才能让CaliburnMicro知道这是它应该提供视图而不是视图模型的情况?
您要做的是为自定义控件添加约定:
- 转到 github 上的 ConventionMananger 代码。
- 搜索
AddElementConvention<ContentControl>
。
在 - 引导程序中创建一个在应用程序启动时运行的新方法。添加与
ContentControl
类似的调用ConventionManager.AddElementConvention<YourControl>
。 - 请确保在控件上放置一个
ContentPropertyAttribute
并指定内容属性。
免责声明:我在移动设备上,无法验证这一点。