web-dev-qa-db-fra.com

Le nom ViewModel n'existe pas dans l'espace de noms "clr-namespace: Project.ViewModels"

Voilà une erreur vraiment étrange. Je travaille sur une application WPF et suit MVVM. Dans ma fenêtre principale, je configure des vues et des modèles de vue et j'obtiens cette étrange erreur. Bien qu'il fonctionne correctement et que l'application fonctionne correctement, mais pourquoi j'obtiens cette erreur.

J'ai également suivi quelques similaires, mais je n'ai pas trouvé de réponse appropriée. J'ai essayé de redémarrer Visual Studio et de nettoyer et reconstruire, mais je suis toujours confronté à cette erreur.

Voici donc le code.

<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".

Voici mon ViewModel

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

Alors, quelle est la vraie erreur. J'utilise Visual Studio 2012 d'ailleurs.

pdate: Mes modèles et vues sont dans le même projet. Je ne fais référence à aucun autre projet. Et MyProject.ViewModels.MainPageViewModel existe.

30
fhnaseer

espace de noms clr: MyProject.ViewModels

Il doit y avoir un espace de noms appelé MyProject.ViewModels qui a une classe appelée MainPageViewModel qui est publique et a un constructeur public sans paramètre dans le même assembly que ProjectDatabaseRebuilder.MainWindow.

Il n'y a pas.

Si MyProject.ViewModels existe dans un assembly référencé, vous devez l'indiquer dans le fichier xmlns.

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

ou certains tels. Honnêtement, il semble que vous ayez copypassé l'exemple de quelqu'un sans réaliser comment ces espaces de noms XML spécialisés fonctionnent dans WPF.

Quelque chose me dit que la réponse ultime sera la suivante: xmlns:vm="clr-namespace:ProjectDatabaseRebuilder.ViewModels".

Veuillez noter que "namespace" et (comme ci-dessus) "Assembly" signifient des espaces de noms et des assemblys, et le désérialiseur xaml utilise ces informations pour localiser les types lors de l'exécution. S'ils sont incorrects, les choses ne fonctionneront pas.


C'est trivial. Vous devez avoir fait quelque chose de bizarre avec votre projet, ce qui pourrait vous obliger à repartir de zéro. Ou, vous pouvez créer un nouveau projet en suivant mon guide ci-dessous, puis le comparer petit à petit au vôtre pour voir où vous vous êtes trompé.

Tout d'abord, créez une nouvelle application WPF appelée MyWpfApplication.

Ajoutez un dossier pour les vues et un pour les modèles de vue. Ajoutez la classe de code VM affichée et affichez UserControl:

enter image description here

Dans votre classe de code, ajoutez les éléments suivants:

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

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

Votre vue est également simple:

<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>

Et, dans votre fenêtre, faites essentiellement ce que vous essayez de faire:

<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>

Et, lors de l'exécution, vous devriez voir tout comme prévu:

enter image description here

Faites-le, puis comparez la solution de travail à votre projet. Si vous ne trouvez aucune différence, vous devrez probablement supprimer votre solution et recommencer à zéro. Copiez du code, pas des fichiers, dans la nouvelle solution.

33
Will

Visual Studio s'attend à ce que les espaces de noms correspondent aux emplacements des dossiers.
Pour résoudre votre problème, quittez Visual Studio et renommez votre dossier de projet en MyProject. Ensuite, démarrez Visual Studio, supprimez le projet de la solution, ajoutez-le à nouveau en tant que "projet existant" et générez le projet, F6 ou ctrl + shift + B

Si vous renommez votre espace de noms après la création du projet, vous obtiendrez ce genre de bogues.

21
brandon

J'ai eu le même problème. J'avais le bon espace de noms, le bon nom de classe et j'ai même mis à jour le PATH. Finalement, j'ai sorti le "DataType" du XAML, je l'ai fait compiler, puis j'ai ajouté le DataType et cela a fonctionné. On dirait que c'était un problème de poulet et d'oeufs. Le XAML ne le voit pas tant qu'il n'a pas été compilé, et vous ne pouvez pas le compiler avec le DataType. Donc, créez d'abord le MV et compilez-le. Ensuite, ajoutez à XAML.

16
Dan Hewett

Reconstruisez votre solution (parfois nettoyer puis construire fonctionne mieux). Ensuite, regardez votre liste d'erreurs, faites défiler vers le bas et cela indiquera très probablement une erreur qui ne permet pas à votre assembly de compiler, et le compilateur XAML utilise très probablement une version mise en cache de l'assembly, pas la nouvelle que vous signifie construire.

9
John C

Fermez et rouvrez Visual Studio.

J'ai essayé certaines des réponses ici (j'utilise VS2012 avec Resharper), et je faisais tout ok, mais j'avais toujours l'erreur. J'ai même pu naviguer vers mes champs liés en utilisant le "cntl" + clic de Resharper, mais j'obtenais toujours des erreurs de compilation XAML et le concepteur ne montrait pas la vue de conception. La fermeture de Visual Studio et sa réouverture l'ont corrigé pour moi.

5
Gordon Slysz

Pour nous, c'était simplement que le projet Dll était défini sur Platform Target x64 dans Visual Studio 2013. Après l'avoir défini sur Any. Tout recommence à fonctionner.

4
lanwin

Cette erreur se produit car un fichier xaml fait référence à un espace de noms non construit.

Ma solution [en 3 étapes]:

1- Commentez un fichier [s] problématique et remplacez-le par une version vide. par exemple pour le vôtre:

<!-- <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- Nettoyer et reconstruire le projet/la solution.

3-Décommentez le code xaml d'origine et supprimez le code xaml temporaire.

c'est fait.

4
kokabi

J'ai eu le même problème. J'avais utilisé Intellisense pour créer le mappage d'espace de noms et il n'avait pas inclus l'attribut Assembly, donc cela ressemblait à ceci:

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

quand je l'ai comparé à un comportement de travail dans une autre fenêtre, j'ai repéré la différence. Quand je l'ai changé en

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

nettoyé et construit, cela a fonctionné.

4
user2871239

Vérifiez le Gestionnaire de configuration dans Visual Studio. Assurez-vous que tous les projets correspondent à la plate-forme. Je voulais que la plate-forme soit x64, mais mon application principale était définie sur AnyCPU. Réglez cela sur x64 et cela a réglé le problème.

4
Greg Osborne

J'ai vécu cela avec Microsoft. La réponse, en résumé, consiste à ajouter votre dossier de sortie de génération à votre CHEMIN.

Apparemment, le concepteur dans Visual Studio charge les DLL et leurs dépendances. Lorsqu'il ne trouve pas de dépendance, il échoue silencieusement et vous obtenez ces types d'erreurs.

Ajouter le dossier de sortie de construction à mon CHEMIN n'est pas vraiment une option dans mon cas, car je crée plusieurs configurations différentes et elles vont toutes dans des dossiers séparés. La dernière chose dont j'ai besoin pour rencontrer un problème étrange causé par un DLL récupéré dans un endroit que je n'avais pas prévu.

Edit: Désolé. Dans ma hâte, j'aurais dû souligner que le ou les dossiers à ajouter au CHEMIN sont les dossiers contenant les DLL dépendantes. Dans mon cas, il s'agit du dossier de sortie de génération, mais cela peut ne pas être vrai dans tous les cas.

2
JAB

La solution est simple, il suffit de commenter votre code DataType et de le compiler d'abord, de décommenter le code, puis le problème est résolu.

Le fichier XAML ne peut tout simplement pas faire référence à des espaces de noms qui n'ont pas été créés.

1
Hunter Hsieh

J'ai rencontré cette erreur et le problème était que j'avais une classe dans le projet avec le même nom de l'Assemblée que j'essayais de référencer. J'ai changé le nom de la classe et cela a fonctionné.

1
bsguedes

Aucune des autres réponses n'a résolu le problème pour moi, mais j'ai finalement trouvé une réponse qui l'a fait. Dans mon cas, cette erreur a uniquement amené le concepteur à se plaindre d'un balisage non valide (c'est-à-dire que tout fonctionnait bien à l'exécution).

J'avais utilisé ReSharper8 pour renommer une de mes classes référencées dans le XAML. Cela a provoqué une autre référence de classe complètement différente dans ce même XAML. Cela était déroutant car la classe à l'origine du problème n'était PAS la même que la classe référencée affichant l'erreur.

L'une des autres réponses a indiqué que l'erreur en question pouvait être provoquée par le changement de nom d'un projet et que la seule façon de le corriger était de supprimer et de rajouter ce projet. De même, j'ai supprimé et recréé le fichier de classe que j'avais renommé et le concepteur a recommencé à travailler.

1
bugged87

Celui-ci me fait des nœuds depuis des heures.

J'ai une solution VS2015 qui a plusieurs années. Sur mon ordinateur portable, il se construit à merveille, tout le code est vérifié dans TFS, mais lorsque j'essayais de le construire sur une autre machine, je recevais constamment ce message sur l'espace de noms inexistant.

Bad Namespace

Fondamentalement, cette RepBaseWindow est une classe héritée de la classe WPF Window, avec quelques bells'n'whistles supplémentaires.

public class RepBaseWindow : Window

J'avais essayé un tas de suggestions ici, mais pas de chance.

L'ironie est que, malgré ce message, si je cliquais avec le bouton droit sur ce lien défectueux et sélectionnais "Afficher le code", cela me conduirait avec plaisir à cette classe. L'espace de noms était bien, la classe était bien ... mais WPF n'était pas content.

Si j'essayais d'utiliser Intellisense pour trouver l'espace de noms, je me retrouverais avec le même balisage ... et les mêmes erreurs de build.

J'ai comparé la copie de travail du code avec la version TFS et j'ai réalisé le problème.

Je devais recommencer à utiliser une ancienne copie du WindowBase.dll fichier de 2012.

Ridicule, hein?

La version de travail de WindowBase.dll a une taille de 635 Ko, et le montre dans l'onglet Détails:

enter image description here

Je poste juste cette réponse pour montrer que, parfois, ces erreurs n'ont absolument rien à voir avec un balisage WPF défectueux ou des noms d'espace de noms mal orthographiés.

J'espère que cela t'aides.

1
Mike Gledhill

J'ai rencontré cela et j'ai eu du mal à le résoudre en fonction des réponses publiées sur ce forum. J'ai renommé mon projet à un moment donné et j'ai introduit une faute de frappe dans le fichier AssemblyInfo.cs généré automatiquement (dans les champs Assembly: AssemblyTitle et Assembly: AssemblyProduct). Étonnamment, ce fut la seule erreur de compilation que j'ai eu en conséquence. Juste quelque chose de peu évident à vérifier si vous obtenez cette erreur et que les suggestions précédentes ne fonctionnent pas.

1
Dave Smash

Je pense que la façon dont je suis tombé sur cela a été de créer la vue en premier, et j'ai indiqué un ViewModel qui n'existait pas. Ensuite, je crée le ViewModel. Erreur lors de l'obtention, impossible de trouver ViewModel.

Enfin, j'ai remarqué que le chemin de la page View nouvellement créée pointait vers le répertoire bin au lieu du répertoire Views. J'ai donc laissé ViewModel seul. Vue supprimée et recréée à nouveau. Cliqué avec le bouton droit et nettoyé le projet, fermé tous les fichiers ouverts dans Solution et reconstruit. Cela l'a finalement corrigé.

0
ekgcorp

J'ai eu le même problème et quand j'ai ajouté un DEFAULT CONSTRUCTOR à mon ViewModel et construit mon logiciel (ctrl + Shift + B), il a commencé à réaliser le ViewModel dans l'espace de noms spécifié!

0
Ehsan

Dans mon cas, la mise en œuvre d'IValueConverter était le problème

J'ai changé:

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 } 

... projet de reconstruction

0
Dariusz Filipiak