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

时间:2014-12-22 19:11:06

标签: c# wpf caliburn.micro

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

  1. 将ContentControl置于撰写视图中。
  2. 在撰写ViewModel时创建一个属性,并为其分配组合的ViewModel
  3. 为ContentControl提供一个x:Name属性,该属性与组合ViewModel上组合的ViewModel属性的名称相匹配。
  4. 像这样......

    查看:

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

1 个答案:

答案 0 :(得分:0)

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

  1. 转到the code for ConventionMananger on github
  2. 搜索AddElementConvention<ContentControl>
  3. 在您的应用程序启动时运行的Bootstrapper中创建一个新方法。添加与ConventionManager.AddElementConvention<YourControl>类似的ContentControl来电。
  4. 确保在控件上放置ContentPropertyAttribute并指定content属性。
  5. 免责声明:我在移动设备上无法验证这一点。