如何将 ContentControl 以外的其他组件绑定到 Caliburn Micro 中的视图

本文关键字:绑定 Caliburn Micro 视图 组件 其他 ContentControl | 更新日期: 2023-09-27 18:35:05

所以在Caliburn Micro中,我一直在使用以下方法在另一个视图中组合一个视图:

  1. 将内容控件放在撰写视图中。
  2. 在组合视图模型上创建一个属性,并为其分配组合视图模型
  3. 为 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知道这是它应该提供视图而不是视图模型的情况?

如何将 ContentControl 以外的其他组件绑定到 Caliburn Micro 中的视图

您要做的是为自定义控件添加约定

  1. 转到 github 上的 ConventionMananger 代码。
  2. 搜索AddElementConvention<ContentControl>
  3. 引导程序中创建一个在应用程序启动时运行的新方法。添加与 ContentControl 类似的调用ConventionManager.AddElementConvention<YourControl>
  4. 请确保在控件上放置一个ContentPropertyAttribute并指定内容属性。

免责声明:我在移动设备上,无法验证这一点。