名称ViewModel在命名空间“clr-namespace:Project.ViewModels”中不存在

时间:2013-06-10 13:55:36

标签: wpf mvvm visual-studio-2012

现在这是一个真正奇怪的错误。我正在研究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".

这是我的ViewModel

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

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

更新 我的视图模型和视图位于同一个项目中。我没有参考任何其他项目。并存在MyProject.ViewModels.MainPageViewModel。

18 个答案:

答案 0 :(得分:33)

  

CLR-名称空间: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"

请注意,“namespace”和(如上所述)“assembly”表示名称空间和程序集,xaml反序列化程序使用此信息在运行时查找类型。如果它们不正确,事情将无效。


这是微不足道的。你必须对你的项目做一些奇怪的事情,这可能需要你从头开始。或者,您可以按照我的指南制作一个新项目,然后一点一点地与您进行比较,看看你哪里出错了。

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

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

enter image description here

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

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>

并且,在运行时,您应该按预期看到所有内容:

enter image description here

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:15)

我遇到了同样的问题。我有正确的命名空间,正确的类名,我甚至更新了PATH。最后,我拿出了&#34; DataType&#34;从XAML,得到它编译,添加DataType回来,它工作。好像这是鸡和蛋的问题。 XAML在编译之前不会看到它,并且您无法在DataType中使用它进行编译。 所以,先创建MV,然后编译它。然后,添加到XAML。

答案 3 :(得分:8)

重建您的解决方案(有时干净然后构建更好)。然后查看你的错误列表,滚动到最底层,它很可能表示一个错误,它不允许你的程序集编译,而且XAML编译器很可能使用程序集的缓存版本,而不是新版本的程序集意味着要建立。

答案 4 :(得分:5)

关闭并重新打开Visual Studio。

我在这里尝试了一些答案(我使用VS2012和Resharper),我一切正常,但仍然有错误。我甚至可以使用Resharper&#39; cntl&#39; +点击导航到我的绑定字段,但仍然得到XAML编译错误,设计师不会显示设计视图。关闭视觉工作室并重新打开为我修复它。

答案 5 :(得分:4)

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

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

当我将它与另一个窗口中的工作行为进行比较时,我发现了差异。当我把它改成

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

清理它并构建它,它工作。

答案 6 :(得分:4)

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

答案 7 :(得分:4)

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

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

1-评论有问题的文件[s]并替换为空版本。 例如你的:

<!-- <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 :(得分:4)

对于我们来说,只是在Visual Studio 2013中将Dll项目设置为Platform Target x64 。将其设置为任何。一切都开始了。

答案 9 :(得分:2)

我和微软一直在讨论这个问题。总之,答案是将构建输出文件夹添加到PATH。

显然,Visual Studio中的设计器会加载DLL及其依赖项。当它找不到依赖项时,它会无声地失败并且您会遇到这些类型的错误。

在我的情况下,将构建输出文件夹添加到我的PATH实际上并不是一个选项,因为我构建了几个不同的配置,它们都转到单独的文件夹。最后一件事我需要遇到一些奇怪的问题,因为DLL是从我没想到的位置拾取的。

编辑:抱歉。在我的仓促中,我应该指出要添加到PATH的文件夹是包含依赖DLL的文件夹。在我的例子中,这是构建输出文件夹,但在所有情况下都可能不是这样。

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:1)

这个人几个小时都打结了我。

我有一个已有几年历史的VS2015解决方案。在我的笔记本电脑上,它构建得很漂亮,所有代码都被检入TFS,但是当我尝试在不同的机器上构建它时,我会经常收到关于命名空间不存在的消息。

Bad Namespace

基本上,这个RepBaseWindow是一个继承自WPF Window类的类,还有一些额外的铃声。

public class RepBaseWindow : Window

我在这里尝试了大量的建议,但没有运气。

具有讽刺意味的是,尽管有这样的信息,如果我右键点击这个错误的链接并选择了“查看代码”,我很乐意带我去上课。命名空间很好,上课很好......但是WPF并不满意。

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

我将代码的工作副本与TFS版本进行了比较,并意识到了问题。

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

荒谬,嘿?

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

enter image description here

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

希望这有帮助。

答案 12 :(得分:1)

我遇到了这个问题,但根据本论坛发布的答案,我遇到了麻烦。我在某个时候重命名了我的项目,并在自动生成的AssemblyInfo.cs文件中引入了一个拼写错误(在程序集中:AssemblyTitle和assembly:AssemblyProduct字段)。令人惊讶的是,这是我得到的唯一编译错误。只是有点不明显的事情要仔细检查一下你是否收到了这个错误并且以前的建议不起作用。

答案 13 :(得分:1)

我遇到了这个错误,问题是我在项目中有一个类,我想要引用的程序集名称相同。我更改了班级名称,但它确实有效。

答案 14 :(得分:0)

在我的案例中,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 } 

...重建项目

答案 15 :(得分:0)

解决方案很简单,只需注释您的DataType代码并首先编译它,取消注释代码,然后问题就解决了。

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

答案 16 :(得分:0)

我认为我遇到的是首先创建View,并指向一个不存在的ViewModel。之后我创建了ViewModel。保持收到错误,找不到ViewModel。

最后我注意到新创建的View页面的路径指向bin目录而不是Views目录。所以,我独自离开了ViewModel。删除并重新创建View。右键单击并清除项目,关闭在Solution中打开的所有文件,然后重建。这最终修复了它。

答案 17 :(得分:0)

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