【问题标题】:The name ViewModel does not exist in the namespace "clr-namespace:Project.ViewModels"命名空间“clr-namespace:Project.ViewModels”中不存在名称 ViewModel
【发布时间】:2013-06-10 13:55:36
【问题描述】:

现在这是一个非常奇怪的错误。我正在开发 WPF 应用程序并关注 MVVM。在我的 MainWindow 中,我正在设置视图和视图模型,但出现了这个奇怪的错误。虽然它构建良好并且应用程序运行良好,但为什么我会收到此错误。

我也关注了一些类似但没有找到合适的答案。我尝试重新启动 Visual Studio 并清理和重建,但仍然遇到此错误。

所以这里是代码。

<Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:MyProject.Views"
        xmlns:vm="clr-namespace:MyProject.ViewModels"
        xmlns:p="clr-namespace:MyProject.Properties"
        Title="{x:Static p:Resources.Title}" Height="400" Width="750" MinHeight="400" MinWidth="750">
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:MainPageViewModel}">
            <v:MainPageView/>
        </DataTemplate>
    </Window.Resources>

Error   1   The name "MainPageViewModel" does not exist in the namespace "clr-namespace:MyProject.ViewModels".

这是我的视图模型

namespace MyProject.ViewModels
{
    public class MainPageViewModel : PropertyChangedBase
    {
        public MainPageViewModel()
        {
        }
    }
}

那么什么是真正的错误。顺便说一句,我使用的是 Visual Studio 2012。

更新: 我的视图模型和视图在同一个项目中。我没有提到任何其他项目。并且 MyProject.ViewModels.MainPageViewModel 存在。

【问题讨论】:

  • 查看 ViewModel 的代码会很有帮助,而不仅仅是 XAML。
  • @EtherDragon 将 ViewModel 代码添加到问题中。
  • 我刚刚使用此答案stackoverflow.com/a/12406977/3917754的说明解决了同样的问题

标签: wpf mvvm visual-studio-2012


【解决方案1】:

clr-namespace:MyProject.ViewModels

必须有一个名为 MyProject.ViewModels 的命名空间,它有一个名为 MainPageViewModel 的类,它是公共的,并且在与 ProjectDatabaseRebuilder.MainWindow 相同的程序集中有一个公共的无参数构造函数。

没有。

如果MyProject.ViewModels 存在于引用的程序集中,则必须在 xmlns 中声明。

xmlns:vm="clr-namespace:MyProject.ViewModels;assembly=MyProject"

或类似的。老实说,看起来您复制粘贴了某人的示例,却没有意识到这些专门的 xml 命名空间在 WPF 中是如何工作的。

有些事情告诉我最终的答案如下:xmlns:vm="clr-namespace:ProjectDatabaseRebuilder.ViewModels"。

请注意,“命名空间”和(如上)“程序集”表示命名空间和程序集,xaml 反序列化程序使用此信息在运行时定位类型。如果它们不正确,事情将无法正常工作。


这是微不足道的。您的项目一定做了一些奇怪的事情,这可能需要您从头开始。或者,您可以按照下面我的指南创建一个新项目,然后将其与您的项目进行一点点比较,看看您哪里出错了。

首先,创建一个名为 MyWpfApplication 的新 WPF 应用程序。

为 Views 添加一个文件夹,为 ViewModels 添加一个文件夹。添加显示的 VM 代码类并查看 UserControl:

在您的代码类中,添加以下内容:

namespace MyWpfApplication.ViewModels
{
    class MainWindowViewModel
    {
        public string Text { get; set; }

        public MainWindowViewModel()
        {
            Text = "It works.";
        }
    }
}

您的视图也很简单:

<UserControl
    x:Class="MyWpfApplication.Views.MainWindowView"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid>
        <TextBlock
            Text="{Binding Text}"
            HorizontalAlignment="Center"
            VerticalAlignment="Center" />
    </Grid>
</UserControl>

并且,在你的窗口中,基本上做你想做的事情:

<Window
    x:Class="MyWpfApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:v="clr-namespace:MyWpfApplication.Views"
    xmlns:vm="clr-namespace:MyWpfApplication.ViewModels"
    Title="DERP"
    Content="{Binding DataContext, RelativeSource={RelativeSource Self}}">
    <Window.Resources>
        <DataTemplate
            DataType="{x:Type vm:MainWindowViewModel}">
            <v:MainWindowView />
        </DataTemplate>
    </Window.Resources>
    <Window.DataContext>
        <vm:MainWindowViewModel />
    </Window.DataContext>
</Window>

而且,在运行时,您应该会看到预期的一切:

执行此操作,然后将工作解决方案与您的项目进行比较。如果您找不到任何差异,您可能需要放弃您的解决方案并重新开始。将代码而不是文件复制到新解决方案中。

【讨论】:

  • 对不起,其实我用MyProject重命名了我原来的项目名称。我也在问题中进行了编辑。
  • @FaisalHafeez:你所做的是正确的。你怎么做的可能不是。清理,重建,重新运行。确保你的 VM 类也是公开的。
  • 我尝试干净重建并重新运行。错误仍然存​​在。虚拟机是公开的。如果我启动应用程序,它运行良好,我的视图就会显示出来,并且它会绑定到 VM。但是在错误窗口中它仍然显示错误。可能是它的Visual Studio错误,不知道。
  • 我在 stackoverflow 上找到了这个。这表示“您的解决方案正在网络上运行”这是什么意思。我不知道。分享。stackoverflow.com/questions/16216662/…
  • 我正在使用 TFS。我已经在我的本地机器上映射了项目。所以它们存在于位置 D:\SomePathLeadingToMyProject。我还需要做点别的吗?
【解决方案2】:

Visual Studio 要求命名空间与文件夹位置匹配。
要解决您的问题,请退出 Visual Studio 并将您的项目文件夹重命名为 MyProject。然后启动 Visual Studio,从解决方案中删除项目,再次将其添加为“现有项目”并构建项目,F6 或 ctrl + shift + B

如果您在项目创建后重命名命名空间,您将遇到这些类型的错误。

【讨论】:

  • 谢谢你。由于这个错误,我一直在挠头好几天,我确信我没有做错任何事。在我的情况下,由于我的测量工作室许可证错误,我不得不从 NI 示例开始我的项目,并且不得不重命名该项目。我遇到了这个可怕的错误,这意味着我的项目正在构建,但设计视图显示了这个错误并且不可用,这使得更改代码变得困难。您的建议立即解决了问题。谢谢。
  • 天哪,非常感谢!你解决了我多年来一直在努力解决的问题。不幸的是,我只能投票一次。
  • 哈哈,是的,从现有项目中复制了我的项目并重命名了除旧文件夹名称之外的所有内容。按照你的建议做了,现在我可以毫无问题地看到我的视图命名空间视图。我为你的回复 +1 了。
【解决方案3】:

我遇到了同样的问题。我有正确的命名空间、正确的类名,甚至更新了 PATH。最后,我从 XAML 中取出“DataType”,让它编译,重新添加 DataType,它就可以工作了。好像是先有鸡还是先有蛋的问题。 XAML 在编译之前不会看到它,并且您无法在 DataType 中使用它进行编译。 所以,首先创建MV,然后编译它。然后,添加到 XAML。

【讨论】:

  • 我有同样的问题,并通过删除 xaml 代码并首先构建然后放回 xaml 代码然后所有工作来解决。这是 WPF 中的一个错误....
  • 检查!通过删除 XAML 并首先构建它来解决!似乎确实是一个错误
  • WinForms 是否有类似的问题?
【解决方案4】:

重新构建您的解决方案(有时干净然后构建效果更好)。然后查看您的错误列表,滚动到最底部,它很可能会指示不允许您的程序集编译的错误,并且 XAML 编译器很可能使用的是程序集的缓存版本,而不是您的新版本意思是建造。

【讨论】:

    【解决方案5】:

    关闭并重新打开 Visual Studio。

    我在这里尝试了一些答案(我正在使用带有 Resharper 的 VS2012),我做的一切都很好,但仍然有错误。我什至可以使用 Resharper 的“cntl”+click 导航到我的绑定字段,但仍然出现 XAML 编译错误,并且设计器不会显示设计视图。关闭视觉工作室并重新打开它为我修复了它。

    【讨论】:

    • 完全正确!!!!这不是第一次......我不应该告诉你我对这种行为有多少次感觉......我很惭愧。非常感谢!
    【解决方案6】:

    检查 Visual Studio 中的配置管理器。确保所有项目都匹配平台。我希望平台是 x64,但我的主要应用程序设置为 AnyCPU。将其设置为 x64 即可解决问题。

    【讨论】:

      【解决方案7】:

      出现此错误是因为 xaml 文件引用了未构建的命名空间。

      我的解决方案 [分 3 步]:

      1- 注释有问题的文件并替换为空版本。 例如给你的:

      <!-- <Window ...> </Window> -->  <!--you orginal xaml code!, uncomment later-->
      
      <Window                          <!-- temp xaml code, remove later -->
          x:Class="MyProject.MainWindow" 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      </Window>
      

      2- 清理并重建项目/解决方案。

      3-取消注释原始 xaml 代码并删除临时 xaml 代码。

      完成了。

      【讨论】:

        【解决方案8】:

        我遇到了同样的问题。我使用 Intellisense 构建命名空间映射,它没有包含程序集属性,所以它看起来像这样:

        xmlns:converters="clr-namespace:XYZ.UI.Converters;
        

        当我将它与另一个窗口中的工作行为进行比较时,我发现了不同之处。当我将其更改为

        xmlns:converters="clr-namespace:XYZ.UI.Converters;assembly=XYZ.UI"
        

        清理并构建它,它起作用了。

        【讨论】:

          【解决方案9】:

          对我们来说,只是在 Visual Studio 2013 中将 Dll 项目设置为 Platform Target x64。将其设置为 Any 后。一切又开始工作了。

          【讨论】:

          • 谢谢你;当没有其他事情做的时候也帮助了我。我已经强制使用 x64,因为该项目引用了非托管的仅 x64 代码,但至少它仍然为 x64 构建。所以暂时切换到“Any CPU”,让那个奇怪的错误消失,设计器又开始工作了……
          【解决方案10】:

          我在微软经历过这个。总而言之,答案是将构建输出文件夹添加到 PATH。

          显然,Visual Studio 中的设计器会加载 DLL 及其依赖项。当它找不到依赖项时,它会静默失败并出现这些类型的错误。

          在我的情况下,将构建输出文件夹添加到我的 PATH 中并不是一个真正的选择,因为我构建了几个不同的配置,并且它们都转到单独的文件夹中。我需要遇到的最后一件事是从我没有预料到的位置拾取 DLL 导致的一些奇怪问题。

          编辑:对不起。匆忙中,我应该指出要添加到 PATH 的文件夹是包含相关 DLL 的文件夹。就我而言,这是构建输出文件夹,但并非在所有情况下都如此。

          【讨论】:

          • 此解决方案对于 XAML 设计器在处理 this 和 this 问题中所述的 C++/CLI DLL 时遇到的问题也很有用。
          【解决方案11】:

          其他答案都没有为我解决问题,但我最终想出了一个可以解决问题的答案。就我而言,这个错误只会导致设计师抱怨无效标记(即在运行时一切正常)。

          我使用 ReSharper8 重命名了我在 XAML 中引用的一个类。这导致同一个 XAML 中另一个完全不同的类引用出现此错误。这很令人困惑,因为导致问题的类与显示错误的引用类不同。

          其他答案之一表明有问题的错误可能是由重命名项目引起的,修复它的唯一方法是删除并重新添加该项目。同样,我删除并重新创建了我重命名的类文件,并且设计器再次开始工作。

          【讨论】:

            【解决方案12】:

            我遇到了这个错误,问题是我在项目中有一个与我试图引用的程序集同名的类。我更改了类名,它起作用了。

            【讨论】:

              【解决方案13】:

              根据此论坛上发布的答案,我遇到了这个问题并且无法解决它。我在某个时候重命名了我的项目,并在自动生成的 AssemblyInfo.cs 文件中引入了一个错字(在程序集:AssemblyTitle 和程序集:AssemblyProduct 字段中)。令人惊讶的是,这是我得到的唯一编译错误。如果您遇到此错误并且之前的建议不起作用,请仔细检查一些不太明显的东西。

              【讨论】:

                【解决方案14】:

                解决方法很简单,先注释你的DataType代码并编译,再取消注释,问题就解决了。

                XAML 文件无法引用尚未构建的命名空间。

                【讨论】:

                  【解决方案15】:

                  这个已经让我纠结了好几个小时了。

                  我有几年前的 VS2015 解决方案。在我的笔记本电脑上,它构建得很漂亮,所有代码都签入到 TFS 中,但是当我尝试在另一台机器上构建它时,我会不断收到关于命名空间不存在的消息。

                  基本上,这个RepBaseWindow 是从WPF Window 类继承的一个类,还有一些额外的花里胡哨。

                  public class RepBaseWindow : Window
                  

                  我在这里尝试了很多建议,但没有运气。

                  具有讽刺意味的是,尽管有此消息,但如果我右键单击此错误链接并选择“查看代码”,它会很乐意将我带到这门课。命名空间很好,类也很好......但 WPF 对此并不满意。

                  如果我尝试使用 Intellisense 来查找命名空间,我最终会得到相同的标记...以及相同的构建错误。

                  我将代码的工作副本与TFS版本进行了比较,发现了问题。

                  我需要重新使用 2012 年的 WindowBase.dll 文件的旧副本。

                  荒谬,嘿?

                  WindowBase.dll 的工作版本大小为 635kb,并在详细信息选项卡中显示:

                  我发布这个答案只是为了表明,有时,这些错误与错误的 WPF 标记或拼写错误的命名空间名称完全无关。

                  希望这会有所帮助。

                  【讨论】:

                    【解决方案16】:

                    在我的情况下,IValueConverter 的实现是问题

                    我变了:

                    public object Convert(object value, 
                      Type targetType, 
                      object parameter, 
                      string language) 
                    { //code }
                    

                    到

                    public object Convert(object value, 
                      Type targetType, 
                      object parameter, 
                      System.Globalization.CultureInfo culture) 
                    { //code } 
                    

                    ...重建项目

                    【讨论】:

                      【解决方案17】:

                      我认为我遇到这种情况是首先创建 View,然后指向一个不存在的 ViewModel。之后我创建了 ViewModel。一直出错,找不到 ViewModel。

                      最后我注意到新创建的 View 页面的路径指向 bin 目录而不是 Views 目录。所以,我独自离开了 ViewModel。再次删除并重新创建视图。右键单击并清理项目,关闭在解决方案中打开的所有文件,然后重新构建。终于解决了。

                      【讨论】:

                        【解决方案18】:

                        我遇到了同样的问题,当我将 DEFAULT CONSTRUCTOR 添加到我的 ViewModel 并构建我的软件 (ctrl+Shift+B) 时,它开始在指定的命名空间中实现 ViewModel!

                        【讨论】:

                          【解决方案19】:

                          它经常发生找不到类或您所指的任何内容。通常最好的解决方案是注释掉 XAML 中的引用并重建解决方案并重试 - 对我总是有效!

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2013-02-09
                            • 2012-12-06
                            • 2016-11-29
                            • 2014-10-19
                            • 2013-04-19
                            • 2014-01-16
                            • 1970-01-01
                            • 2023-03-07
                            相关资源
                            最近更新 更多