【问题标题】:Does Caliburn.Micro play nicely with user controls?Caliburn.Micro 能否很好地与用户控件配合使用?
【发布时间】:2012-03-23 17:34:25
【问题描述】:

我是一名新手 WPF 程序员。我正在尝试向我的代码添加一些结构:用户控件和 MVVM。

在这里研究,我发现people recommend Caliburn.Micro。另一方面,我发现了一些抱怨 hereelsewhere 关于 Caliburn.Micro 不能很好地与 UserControls 配合使用。

所以我的问题是:Caliburn.Micro 与用户控件配合得很好吗?

【问题讨论】:

    标签: wpf mvvm user-controls caliburn.micro


    【解决方案1】:

    是的,Caliburn.Micro 与用户控件配合得很好。这是一个固执己见的框架,但不会强迫你走上特定的发展道路。正如链接问题的答案所暗示的,如果您有任何特定问题,您始终可以使用普通的旧 WPF 绑定。

    事实上,我根本不会让这两个链接阻止您,第一个是描述将单独的属性绑定到单个用户控件的方法,并且该解决方案是有效的。更好的解决方案可能是使用 ItemsControl 和自定义 DataTemplate,然后在他的视图模型上创建包含属性名称和值的 DTO 集合。

    第二个链接说明如果您创建一个视图 (UserControl) 并在 XAML 中创建该视图的一个实例,并且您希望将其绑定到一个视图模型,那么首先称为视图,并且您有告诉 Caliburn.Micro 视图模型要绑定到哪里:

    <UserControl ...
       cal:Bind.Model="EasyPlayer.MediaControl.NowPlayingViewModel" />
    

    所以,这在概念上可以被认为是一个视图模型/视图,而不是一个具有依赖属性等的 UserControl。

    实际上,您会发现,当您使用 Caliburn.Micro 时,您可能会越来越少地使用UserControls 来执行视图合成。这是因为使用视图模型、视图和视图模型优先方法很容易创建可重用的 UI 片段。

    当您的视图中有一个ContentControl 与父视图模型上的视图模型属性同名时,Caliburn.Micro 将定位相应视图模型的视图,将其注入ContentControl,并绑定视图/视图模型。

    例如:

    public class MyParentViewModel : Screen
    {
      public MenuViewModel MenuViewModel { get; set; }
    
      public DetailsViewModel DetailsViewModel { get; set; }
    
      public MyParentViewModel()
      {
        this.MenuViewModel = new MenuViewModel();
        this.DetailsViewModel = new DetailsViewModel();
      }
    }
    
    <Grid> 
      <Grid.ColumnDefinitions> 
        <ColumnDefinition Width=".2*" />
        <ColumnDefinition Width=".8*" />
      </Grid.ColumnDefinitions>
    
      <ContentControl Grid.Column="0" x:Name="MenuViewModel" />
      <ContentControl Grid.Column="1" x:Name="DetailsViewModel" />
    
    </Grid>
    

    【讨论】:

    • 从 caliburn 开始,刚刚看到您非常有帮助的帖子 - ...现在可以扩展一点使用 usercontrols ... afaics 视图将成为 usercontrol 不是吗? thxvm
    • 是的,使用 Caliburn.Micro,您将不会使用具有依赖属性的用户控件意义上的用户控件,也不会直接从另一个用户控件/窗口等实例化控件。
    • 好的...但是您仍然会在用户控件中放置一个网格(在 viewmodel/xaml 中包含所有自定义行为)并通过 Caliburn.Micro 将其动态加载到 ContentControl ? (只是想检查一下我没有遗漏什么)。再次非常感谢。
    • 是的,这是正确的,或者如果您正在使用窗口管理器并希望以声明方式控制窗口属性,则可以使用窗口
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多