【问题标题】:Cannot find view for ViewModel找不到 ViewModel 的视图
【发布时间】:2012-06-20 10:48:29
【问题描述】:

我有一个使用 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 的视图。

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

【问题讨论】:

    标签: wpf caliburn.micro


    【解决方案1】:

    我认为,我认为可以通过两种方式解决此问题。 1.在解决方案中,你应该有两个文件夹,一个是“Views”,另一个是“ViewModels”。

    2.在您的引导程序中,您需要添加视图模型或视图所在的程序集:

    protected override IEnumerable<Assembly> SelectAssemblies()
    {
        var assemblies = base.SelectAssemblies().ToList();
        assemblies.Add(typeof(Project.ViewsNamespace.SomeView).Assembly);
       return assemblies;
    }
    

    【讨论】:

      【解决方案2】:

      检查拼写错误。意思是如果您的 ViewModel 类名称是 ShellViewModel.CS,那么您的视图名称应该是 ShellView。打字错误可能在您的 ViewModel 文件夹中,您有 ShelViewModel.CS,而在您的 View 文件夹中,您有 ShellView.CS。

      【讨论】:

        【解决方案3】:

        Caliburn Micro 期望您的项目中有特定的文件结构。您的视图和视图模型应位于名为 Views 和 ViewModels 的单独文件夹中。

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

        【讨论】:

        • 我正在维护的应用程序已经有各种视图和视图模型。它们都不存在于名称为 Views 和 ViewModels 的文件夹中,但它们仍然有效。它们都存在于不同的类库项目中,我正在添加一个名为 ReferenceMaintenanceWorkspace 的新项目。我想知道项目是否应该有一些我不知道的特定设置......
        • 可能是手动完成的 Caliburn.Micro.View.SetModel(NameView, NameViewModel);
        • 或在视图中
        • 想通了。我没有从另一个地方复制和粘贴 View 和 ViewModel 文件,而是为 View 创建了一个全新的 UserControl 并为 ViewModel 创建了一个类......它工作了!我仍然不知道有什么区别......
        • 这种“在你的项目中期望某些文件结构”对我来说似乎是 Caliburn Micro 的一个主要限制。当然,MVVM 的全部意义在于将 ViewModel 和 View 解耦,这样它们就可以彼此隔离。使用此模型,它们不仅紧密耦合,而且通过“约定”而不是显式实现。
        【解决方案4】:

        确保您有文件夹 ViewModels 和 Views。还要确保您的类和用户控件/窗口的名称也遵循这些命名约定,例如:

        • = 视图模型
        • == YoloViewModel
        • = 观看次数
        • == YoloView

        如果视图和视图模型位于不同的程序集中,请尝试以下操作:

        在您的引导程序中,您需要添加视图模型/视图所在的程序集:

        protected override IEnumerable<Assembly> SelectAssemblies()
        {
          var assemblies = base.SelectAssemblies().ToList();
          assemblies.Add(typeof(MyProject.Foo.ViewModels.YoloViewModel).Assembly);
        
          return assemblies;
        }
        

        【讨论】:

          【解决方案5】:

          只是为了将来,它也会在重命名类/包之后发生,但在视图中 xaml 文件“x:Class”没有更新。

          【讨论】:

            【解决方案6】:

            您应该在引导程序中覆盖 SelectAssemblies 并提供您的视图所在的程序集名称。

            【讨论】:

              猜你喜欢
              • 2019-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多