34

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

我也关注了一些类似但没有找到合适的答案。我试图重新启动视觉工作室并清理和重建,但我仍然面临这个错误。

所以这里是代码。

<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 存在。

4

19 回答 19

36

clr 命名空间:MyProject.ViewModels

必须有一个名为的命名空间,该命名空间具有一个公共MyProject.ViewModels类 Called ,并且在与.MainPageViewModelProjectDatabaseRebuilder.MainWindow

那没有。

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

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>

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

在此处输入图像描述

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

于 2013-06-10T16:27:40.723 回答
24

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

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

于 2014-01-01T20:14:09.697 回答
18

I had the same problem. I had the right namespace, the right class name, and I even updated the PATH. Finally, I took out the "DataType" from the XAML, got it to compile, the added the DataType back in and it worked. Seems like it was a chicken and egg problem. The XAML doesn't see it until it has been compiled in, and you can't compile with it in the DataType. So, create the MV first, and compile it. Then, add to XAML.

于 2014-12-03T22:10:25.130 回答
10

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

于 2014-02-04T01:59:47.133 回答
7

关闭并重新打开 Visual Studio。

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

于 2014-07-07T18:00:31.150 回答
5

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

于 2017-03-17T13:31:52.957 回答
5

发生此错误是因为 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 代码。

完成。

于 2015-12-12T11:00:26.237 回答
4

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

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

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

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

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

于 2014-12-07T11:30:33.497 回答
4

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

于 2016-07-22T12:19:35.210 回答
2

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

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

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

于 2015-01-01T21:29:26.677 回答
2

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

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

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

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

于 2013-10-10T14:29:42.043 回答
1

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

于 2014-12-19T17:59:07.060 回答
1

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

于 2014-07-17T16:19:29.510 回答
1

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

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

错误的命名空间

基本上,这RepBaseWindow是一个继承自 WPFWindow类的类,带有一些额外的花里胡哨。

public class RepBaseWindow : Window

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

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

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

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

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

可笑,嘿?

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

在此处输入图像描述

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

希望这可以帮助。

于 2017-05-17T09:19:50.187 回答
1

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

XAML 文件不能引用尚未构建的命名空间。

于 2017-03-08T02:28:43.327 回答
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 } 

...重建项目

于 2016-01-07T19:04:03.777 回答
0

我认为我遇到的问题是首先创建视图,然后指向一个不存在的视图模型。之后我创建了 ViewModel。不断出错,找不到 ViewModel。

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

于 2017-04-07T15:07:31.953 回答
0

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

于 2019-08-09T15:16:34.843 回答
0

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

于 2021-08-23T16:03:54.900 回答