Имя 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 существует.
Ответы
Ответ 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, и перестройте. Это окончательно зафиксировало это.