无法找到ViewModel的视图

11

我有一个使用Caliburn.Micro的WPF应用程序。我有一个视图MyView:

<UserControl x:Class="ReferenceMaintenanceWorkspace.MyView"
         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"
         >
  <UserControl.Resources>
 </UserControl.Resources>
 <TabControl x:Name="Items" > 
</TabControl>

我也有一个MyViewModel:

using System.ComponentModel.Composition;

namespace ReferenceMaintenanceWorkspace
{
[Export(typeof(MyViewModel))]
public class MyViewModel
{
  public MyViewModel()
  {
      base.DisplayName = "Reference Maintenance";
  }

由于某些原因,我在选项卡控件上收到以下消息:

找不到ReferenceMaintenanceWorkspace.MyViewModel的视图。

您能否解释一下为什么会发生这种情况? 谢谢。

6个回答

17

仅针对未来,当类/包重命名时,也会发生此情况,但在视图xaml文件中,“x:Class”未更新。


12

Caliburn Micro期望您的项目具有特定的文件结构。您的视图和视图模型应该分别放在名为Views和ViewModels的不同文件夹中。

这里是一个很好的Hello World示例,描述了这一点。


1
我正在维护的应用程序已经有了各种视图和视图模型。它们都没有存在于名为Views和ViewModels的文件夹中,但它们仍然可以正常工作。尽管如此,它们都存在于不同的类库项目中,而我正在添加一个名为ReferenceMaintenanceWorkspace的新项目。我想知道这些项目是否应该具有我不知道的特定设置... - David Shochet
1
可能是手动完成的 Caliburn.Micro.View.SetModel(NameView, NameViewModel); - ShadeOfGrey
1
搞定了。我没有从其他地方复制和粘贴View和ViewModel文件,而是创建了一个全新的UserControl用于View和一个类用于ViewModel...然后它就起作用了!虽然我仍然不知道区别在哪里... - David Shochet
1
这个“期望项目中特定文件结构”的限制对我来说似乎是Caliburn Micro的一个重大局限。毫无疑问,MVVM的整个重点在于解耦ViewModel和View,使它们可以相互隔离。但是,使用这种模型,它们不仅紧密耦合,而且是通过“约定”而不是显式地完成的。 - Stephen Holt
感谢@ShadeOfGrey,我不知道View.SetModel。 - juFo
显示剩余11条评论

8

您应该在启动程序中覆盖SelectAssemblies,并提供包含您的视图的程序集名称。


4
请确保您拥有ViewModels和Views文件夹。此外,请确保您的类和用户控件/窗口的名称也遵循这些命名约定,如下所示:
- ViewModels -- YoloViewModel
- Views -- YoloView
如果视图和视图模型位于不同的程序集中,请尝试以下操作:
在您的引导程序中,您需要添加包含ViewModel/View的程序集:
protected override IEnumerable<Assembly> SelectAssemblies()
{
  var assemblies = base.SelectAssemblies().ToList();
  assemblies.Add(typeof(MyProject.Foo.ViewModels.YoloViewModel).Assembly);

  return assemblies;
}

1
我同意,我认为有两种方法来解决这个问题: 1.在解决方案中,您应该有两个文件夹,一个名为“Views”,另一个名为“ViewModels”。 2.在引导程序中,您需要添加视图模型或视图所在的程序集:
protected override IEnumerable<Assembly> SelectAssemblies()
{
    var assemblies = base.SelectAssemblies().ToList();
    assemblies.Add(typeof(Project.ViewsNamespace.SomeView).Assembly);
   return assemblies;
}

0

检查拼写错误。如果您的ViewModel类名为ShellViewModel.CS,则视图名称应为ShellView。拼写错误可能在您的ViewModel文件夹中存在ShelViewModel.CS,在您的View文件夹中存在ShellView.CS。


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