Caliburn.Micro在使用用户控件时表现良好吗?

16

我是一名初级WPF程序员。我试图为我的代码添加一些结构:包括用户控件和MVVM。

在这里进行研究后,我发现人们推荐使用Caliburn.Micro。另一方面,我在这里以及其他地方发现了一些关于Caliburn.Micro与UserControls不兼容的投诉。

因此,我的问题是:Caliburn.Micro是否与User Controls兼容?

1个回答

38

是的,Caliburn.Micro可以很好地与用户控件一起使用。它是一个有偏见的框架,但不会迫使您走向特定的开发路径。正如连接问题的答案所建议的那样,如果您有任何特定问题,始终可以使用普通的WPF绑定。

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

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

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

因此,从概念上讲,这可以被看作是一个视图模型/视图,而不是具有依赖属性等的UserControl。

事实上,当使用Caliburn.Micro时,您会发现您可能会越来越少地使用进行视图组合。这是因为使用视图模型、视图和视图模型优先方法非常容易创建可重用的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>

2
是的,通过使用Caliburn.Micro,您不会在具有依赖属性的用户控件中直接实例化控件,也不会从另一个用户控件/窗口直接实例化控件。 - devdigital
2
是的,那是正确的。如果您正在使用窗口管理器并希望以声明方式控制窗口属性,您也可以使用窗口。 - devdigital
太好了,非常感谢。抱歉,我还是新手,能否请您详细解释一下(或者提供相关链接)关于您提到的“使用Windows”的意思?再次感谢。 - Simon Woods
2
请查看http://msdn.microsoft.com/en-gb/library/system.windows.window.aspx和http://www.mindscapehq.com/blog/index.php/2012/03/13/caliburn-micro-part-5-the-window-manager/。 - devdigital
可以使用 DI 容器,并将 MenuViewModel 作为 ParentViewModel 的构造函数参数包含在内,以自动适配它们。 - mxmissile
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接