Подтвердить что ты не робот

Имя ViewModel не существует в пространстве имен "clr-namespace: Project.ViewModels"

Теперь это настоящая странная ошибка. Я работаю над 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".

Вот мой ViewModel

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

Итак, что такое реальная ошибка. Кстати, я использую Visual Studio 2012.

Update: Мои взгляды и взгляды находятся в одном проекте. Я не ссылаюсь ни на какой другой проект. И MyProject.ViewModels.MainPageViewModel существует.

4b9b3361

Ответ 1

CLR-пространств имен: MyProject.ViewModels

Должно существовать пространство имен с именем MyProject.ViewModels, которое имеет класс Called MainPageViewModel, открытый и имеющий открытый конструктор без параметров в рамках той же сборки, что и ProjectDatabaseRebuilder.MainWindow.

Нет.

Если MyProject.ViewModels существует в ссылочной сборке, вы должны указать это внутри xmlns.

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

или некоторые такие. Честно говоря, похоже, что вы копировали экземпляр какого-либо примера, не понимая, как эти специализированные пространства имен xml работают в WPF.

Что-то подсказывает, что окончательный ответ будет следующим: xmlns:vm="clr-namespace:ProjectDatabaseRebuilder.ViewModels".

Обратите внимание, что "пространство имен" и (как указано выше) "сборка" означают пространства имен и сборки, а десериализатор xaml использует эту информацию для поиска типов во время выполнения. Если они неверны, все не будет работать.


Это тривиально. Вы, должно быть, сделали что-то странное в своем проекте, что может потребовать вас начать с нуля. Или вы можете сделать новый проект после моего руководства ниже, а затем сравнить его пополам, чтобы узнать, где вы поступили неправильно.

Сначала создайте новое приложение WPF под названием MyWpfApplication.

Добавьте папку для видов и одну для 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

Сделайте это, затем сравните рабочее решение с вашим проектом. Если вы не можете найти никаких различий, вам, вероятно, нужно просто отказаться от своего решения и начать новый. Скопируйте код, а не файлы, в новое решение.

Ответ 2

Visual Studio ожидает, что пространства имен будут соответствовать местоположениям папок.
Чтобы решить вашу проблему, выйдите из Visual Studio и переименуйте папку проекта в MyProject. Затем запустите Visual Studio, удалите проект из решения, добавьте его снова как "существующий проект" и создайте проект, F6 или ctrl + shift + B

Если вы переименуете свое пространство имен после создания проекта, вы получите такие ошибки.

Ответ 3

У меня была та же проблема. У меня было правильное пространство имен, правильное имя класса, и я даже обновил PATH. Наконец, я вынул "DataType" из XAML, получил его для компиляции, добавил DataType и работал. Похоже, это была проблема с курицей и яйцом. XAML не видит его, пока он не был скомпилирован, и вы не можете скомпилировать его в DataType. Итак, сначала создайте MV и скомпилируйте его. Затем добавьте XAML.

Ответ 4

Восстановите свое решение (иногда чист, а затем строит работу лучше). Затем просмотрите список ошибок, прокрутите до самого нижнего уровня и, скорее всего, укажете на ошибку, которая не позволяет сборке компилироваться, а компилятор XAML, скорее всего, использует кешированную версию сборки, а не новую, которую вы означает построить.

Ответ 5

Закрыть и снова открыть Visual Studio.

Я попробовал некоторые из ответов здесь (я использую VS2012 с Resharper), и я делал все нормально, но все еще имел ошибку. Я даже смог перейти к своим связанным полям, используя Resharper 'cntl' + click, но все еще получал ошибки компиляции XAML, и дизайнер не показывал проектный вид. Закрытие визуальной студии и повторное открытие фиксировали ее для меня.

Ответ 6

У меня была та же проблема. Я использовал Intellisense для создания сопоставления пространства имен и не включил атрибут сборки, поэтому он выглядел так:

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

когда я сравнил его с рабочим Поведением в другом окне, я заметил разницу. Когда я изменил его на

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

очистил его и построил, он сработал.

Ответ 7

Для нас просто было, что для проекта Dll был установлен Target Target x64 в Visual Studio 2013. После установки его Любые. Все снова начинает работать.

Ответ 8

Проверьте Configuration Manager в Visual Studio. Убедитесь, что все проекты соответствуют платформе. Я хотел, чтобы платформа была x64, но мое основное приложение было настроено на AnyCPU. Установите это на x64, и он позаботился о проблеме.

Ответ 9

Я прошел через это с Microsoft. Ответ, в общем, заключается в том, чтобы добавить вашу выходную папку сборки в ваш PATH.

По-видимому, разработчик в Visual Studio загружает библиотеки DLL и их зависимости. Когда он не может найти зависимость, он терпит неудачу, и вы получаете эти типы ошибок.

Добавление папки вывода сборки в мой PATH на самом деле не является вариантом в моем случае, потому что я создаю несколько разных конфигураций, и все они идут в отдельные папки. Последнее, что мне нужно, чтобы столкнуться с какой-то странной проблемой, вызванной тем, что DLL выбрана из того места, которое я не ожидал.

Изменить: Извините. В своей спешке я должен был указать, что папка (ы), которую нужно добавить в PATH, это папка (ы), содержащая зависимые DLL. В моем случае это папка вывода сборки, но это может быть неверно во всех случаях.

Ответ 10

Эта ошибка возникает из-за ссылки файла 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.

Сделано.

Ответ 11

Я столкнулся с этой ошибкой, и проблема заключалась в том, что у меня был класс внутри проекта с тем же именем сборки, которую я пытался ссылаться. Я изменил имя класса, и оно сработало.

Ответ 12

Я столкнулся с этим и не смог обработать его на основе ответов, размещенных на этом форуме. В какой-то момент я переименовал свой проект и ввел опечатку в автоматически сгенерированный файл AssemblyInfo.cs(в сборке: AssemblyTitle и сборка: AssemblyProduct). Удивительно, но это была единственная ошибка компиляции, которую я получил в результате. Просто что-то не очевидное, чтобы дважды проверить, если вы получаете эту ошибку, и предыдущие предложения не работают.

Ответ 13

Ни один из других ответов не решил проблему для меня, но я в конце концов придумал ответ. В моем случае эта ошибка только заставляла дизайнера жаловаться на недопустимую разметку (т.е. Все работало нормально во время выполнения).

Я использовал ReSharper8 для переименования одного из моих классов, на которые ссылаются в XAML.. Это вызвало другую совершенно другую ссылку на класс в том же XAML, чтобы иметь эту ошибку. Это сбивало с толку, потому что класс, вызывающий проблему, был НЕ таким же, как ссылочный класс, отображающий ошибку.

Один из других ответов указал, что ошибка может быть вызвана переименованием проекта, и единственный способ исправить это - удалить и повторно добавить этот проект. Аналогично, я удалил и повторно создал файл класса, который я переименовал, и дизайнер снова начал работать.

Ответ 14

Это связывает меня в узлах часами.

У меня есть решение VS2015, которому уже несколько лет. На моем ноутбуке он прекрасно строится, весь код проверяется на TFS, но когда я пытался его создать на другой машине, я постоянно получал бы это сообщение о том, что пространство имен не существует.

Плохое пространство имен

В принципе, этот RepBaseWindow является классом, унаследованным от класса WPF Window, с несколькими дополнительными звонками.

public class RepBaseWindow : Window

Я попробовал загрузку предложений здесь, но не повезло.

Ирония заключается в том, что, несмотря на это сообщение, если бы я щелкнул правой кнопкой по этой ошибочной ссылке и выбрал "View Code", он с удовольствием отвел бы меня в этот класс. Пространство имен было прекрасно, класс был прекрасен... но WPF не был доволен этим.

Если я попытался использовать Intellisense для поиска пространства имен, я бы получил ту же разметку... и те же ошибки сборки.

Я сравнил рабочую копию кода с версией TFS и понял проблему.

Мне нужно было вернуться к использованию старой копии файла WindowBase.dll с 2012 года.

Смешно, эй?

Рабочая версия WindowBase.dll имеет размер 635 КБ и показывает это на вкладке сведений:

введите описание изображения здесь

Я просто отправляю этот ответ, чтобы показать, что иногда эти ошибки не имеют абсолютно никакого отношения к ошибочной разметке WPF или неправильным именам имен имен.

Надеюсь, что это поможет.

Ответ 15

В моем случае реализация IValueConverter была проблемой

Я изменил:

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

to

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

... перестроить проект

Ответ 16

Решение легко, просто прокомментируйте свой код DataType и сначала скомпилируйте его, раскомментируйте код обратно, затем проблема будет решена.

Файл XAML просто не может ссылаться на пространства имен, которые еще не были построены.

Ответ 17

Я думаю, что я столкнулся с этим, чтобы сначала создать представление, и указал на ViewModel, который не существовал. Впоследствии я создаю ViewModel. Не удалось найти ViewModel.

Наконец, я заметил, что путь только что созданной страницы просмотра указывал на каталог bin вместо каталога Views. Итак, я оставил ViewModel в покое. Удален и воссоздан. Просмотр еще раз. Щелкните правой кнопкой мыши и очистите проект, закройте все файлы, открытые в Solution, и перестройте. Это окончательно зафиксировало это.