it-swarm.com.de

Der Name ViewModel existiert nicht im Namensraum "clr-namespace: Project.ViewModels"

Das ist ein merkwürdiger Fehler. Ich arbeite an einer WPF-Anwendung und folge MVVM. In meinem Hauptfenster stelle ich Ansichten und Ansichtsmodelle ein und ich erhalte diesen merkwürdigen Fehler. Obwohl es gut baut und die Anwendung gut läuft, aber warum bekomme ich diesen Fehler.

Ich verfolgte auch einige ähnliche, fand aber keine passende Antwort. Ich habe versucht, Visual Studio neu zu starten und zu bereinigen und neu zu erstellen, aber ich stehe immer noch vor diesem Fehler.

Also hier ist der 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".

Hier ist mein ViewModel

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

Also, was ist ein echter Fehler. Ich benutze übrigens Visual Studio 2012.

pdate: Meine Ansichtsmodelle und Ansichten befinden sich im selben Projekt. Ich beziehe mich nicht auf ein anderes Projekt. Und MyProject.ViewModels.MainPageViewModel ist vorhanden.

30
fhnaseer

clr-Namespace: MyProject.ViewModels

Es muss einen Namespace namens MyProject.ViewModels Mit einer Klasse namens MainPageViewModel geben, die öffentlich ist und einen öffentlichen parameterlosen Konstruktor in derselben Assembly wie ProjectDatabaseRebuilder.MainWindow Hat.

Da ist nicht.

Wenn in einer Assembly, auf die verwiesen wird, MyProject.ViewModels Vorhanden ist, müssen Sie dies in den xmlns angeben.

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

oder so etwas. Ehrlich gesagt scheint es so, als hätten Sie ein Beispiel von jemandem kopiert, ohne zu bemerken, wie diese speziellen XML-Namespaces in WPF funktionieren.

Etwas sagt mir, dass die ultimative Antwort die folgende sein wird: xmlns:vm="clr-namespace:ProjectDatabaseRebuilder.ViewModels".

Beachten Sie, dass "Namespace" und (wie oben) "Assembly" Namespaces und Assemblys bedeuten und der XAML-Deserializer diese Informationen verwendet, um Typen zur Laufzeit zu lokalisieren. Wenn sie falsch sind, funktionieren die Dinge nicht.


Das ist trivial. Sie müssen mit Ihrem Projekt etwas Seltsames gemacht haben, was es erforderlich machen könnte, dass Sie von vorne anfangen. Oder Sie können ein neues Projekt erstellen, indem Sie meinem nachstehenden Leitfaden folgen und es dann nach und nach mit Ihrem vergleichen, um festzustellen, wo Sie einen Fehler gemacht haben.

Erstellen Sie zunächst eine neue WPF-Anwendung mit dem Namen MyWpfApplication.

Fügen Sie einen Ordner für Ansichten und einen für ViewModels hinzu. Fügen Sie die angezeigte VM Codeklasse hinzu und zeigen Sie UserControl an:

enter image description here

Fügen Sie in Ihrer Code-Klasse Folgendes hinzu:

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

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

Ihre Ansicht ist auch einfach:

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

Und tun Sie in Ihrem Fenster im Wesentlichen das, was Sie versuchen zu tun:

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

Und wenn Sie ausgeführt werden, sollten Sie alles wie erwartet sehen:

enter image description here

Tun Sie dies und vergleichen Sie die funktionierende Lösung mit Ihrem Projekt. Wenn Sie keine Unterschiede feststellen können, müssen Sie wahrscheinlich nur Ihre Lösung verschrotten und neu beginnen. Kopieren Sie Code und keine Dateien in die neue Lösung.

33
Will

Visual Studio erwartet, dass Namespaces den Speicherorten der Ordner entsprechen.
Um Ihr Problem zu lösen, beenden Sie Visual Studio und benennen Sie Ihren Projektordner in MyProject um. Starten Sie dann Visual Studio, entfernen Sie das Projekt aus der Projektmappe, fügen Sie es erneut als "vorhandenes Projekt" hinzu und erstellen Sie das Projekt. F6 oder ctrl + shift + B

Wenn Sie Ihren Namespace nach dem Erstellen des Projekts umbenennen, treten diese Fehler auf.

21
brandon

Ich hatte das gleiche problem Ich hatte den richtigen Namespace, den richtigen Klassennamen und sogar den PATH aktualisiert. Schließlich nahm ich den "DataType" aus der XAML heraus, ließ ihn kompilieren, fügte den DataType wieder ein und es funktionierte. Scheint als wäre es ein Hühnchen und Ei Problem. Die XAML sieht es erst, wenn es in kompiliert wurde, und Sie können im Datentyp nicht damit kompilieren. Erstellen Sie also zuerst die MV und kompilieren Sie sie. Fügen Sie dann zu XAML hinzu.

16
Dan Hewett

Erstellen Sie Ihre Lösung neu (manchmal funktioniert das Bereinigen und Erstellen besser). Sehen Sie sich dann Ihre Fehlerliste an, scrollen Sie ganz nach unten, und es wird höchstwahrscheinlich ein Fehler angezeigt, bei dem Ihre Assembly nicht kompiliert werden kann, und der XAML-Compiler verwendet höchstwahrscheinlich eine zwischengespeicherte Version der Assembly, nicht die von Ihnen neu erstellte meine zu bauen.

9
John C

Schließen Sie Visual Studio und öffnen Sie es erneut.

Ich habe hier einige Antworten ausprobiert (ich verwende VS2012 mit Resharper), und ich habe alles in Ordnung gemacht, hatte aber immer noch den Fehler. Ich konnte sogar mit Resharper 'cntl' + Klick zu meinen gebundenen Feldern navigieren, bekam aber immer noch XAML-Kompilierungsfehler und der Designer zeigte die Entwurfsansicht nicht an. Das Schließen von Visual Studio und das erneute Öffnen haben das Problem für mich behoben.

5
Gordon Slysz

Für uns war es einfach so, dass das DLL-Projekt in Visual Studio 2013 auf Platform Target x64 gesetzt wurde. Nach dem Setzen auf Any. Alles beginnt wieder zu funktionieren.

4
lanwin

Dieser Fehler tritt auf, weil eine XAML-Datei auf nicht erstellten Namespace verweist.

Meine Lösung [in 3 Schritten]:

1- Kommentieren Sie eine problematische Datei (en) und ersetzen Sie sie durch eine leere Version. Zum Beispiel für Ihre:

<!-- <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- Bereinigen und erstellen Sie das Projekt/die Projektmappe neu.

3-Entkommentieren Sie den ursprünglichen XAML-Code und entfernen Sie den temporären XAML-Code.

es ist fertig.

4
kokabi

Ich hatte das gleiche problem Ich hatte das Namespace-Mapping mit Intellisense erstellt und das Assembly-Attribut nicht angegeben. Es sah also so aus:

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

als ich es mit einem funktionierenden Verhalten in einem anderen Fenster verglich, bemerkte ich den Unterschied. Als ich es geändert habe

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

es gereinigt und gebaut, es hat funktioniert.

4
user2871239

Überprüfen Sie den Konfigurationsmanager in Visual Studio. Stellen Sie sicher, dass alle Projekte mit der Plattform übereinstimmen. Ich wollte, dass die Plattform x64 ist, aber meine primäre Anwendung war auf AnyCPU eingestellt. Stellen Sie das auf x64 und es hat sich des Problems angenommen.

4
Greg Osborne

Ich habe dies mit Microsoft durchgemacht. Zusammenfassend lässt sich sagen, dass Sie Ihren Build-Ausgabeordner Ihrem PATH hinzufügen müssen.

Anscheinend lädt der Designer in Visual Studio DLLs und ihre Abhängigkeiten. Wenn es keine Abhängigkeit findet, schlägt es unbemerkt fehl und Sie erhalten diese Art von Fehlern.

Das Hinzufügen des Build-Ausgabeordners zu meinem PATH ist in meinem Fall nicht wirklich eine Option, da ich verschiedene Konfigurationen erstelle und sie alle in getrennten Ordnern abgelegt werden. Als letztes muss ich auf ein seltsames Problem stoßen, das dadurch verursacht wurde, dass eine DLL von einem Ort abgeholt wurde, den ich nicht erwartet hatte.

Bearbeiten: Entschuldigung. In meiner Hast hätte ich darauf hinweisen müssen, dass die Ordner, die dem PATH hinzugefügt werden sollen, die Ordner sind, die die abhängigen DLLs enthalten. In meinem Fall ist dies der Build-Ausgabeordner, dies ist jedoch möglicherweise nicht in allen Fällen der Fall.

2
JAB

Die Lösung ist einfach: Kommentieren Sie Ihren DataType-Code und kompilieren Sie ihn zuerst. Kommentieren Sie den Code zurück, und das Problem ist behoben.

XAML-Datei kann nur nicht auf Namespaces verweisen, die nicht erstellt wurden.

1
Hunter Hsieh

Ich bin auf diesen Fehler gestoßen, und das Problem war, dass ich innerhalb des Projekts eine Klasse mit demselben Namen wie die Assembly hatte, auf die ich mich beziehen wollte. Ich habe den Klassennamen geändert und es hat funktioniert.

1
bsguedes

Keine der anderen Antworten löste das Problem für mich, aber ich fand schließlich eine Antwort, die es tat. In meinem Fall hat dieser Fehler nur dazu geführt, dass sich der Designer über ungültiges Markup beschwert hat (d. H., Zur Laufzeit hat alles einwandfrei funktioniert).

Ich hatte ReSharper8 verwendet, um eine meiner Klassen, auf die in der XAML verwiesen wird, umzubenennen. Dies führte dazu, dass eine andere, völlig andere Klassenreferenz in derselben XAML diesen Fehler aufwies. Dies war verwirrend, da die Klasse, die das Problem verursacht, NICHT mit der referenzierten Klasse identisch war, die den Fehler anzeigt.

In einer der anderen Antworten wurde angegeben, dass der betreffende Fehler durch das Umbenennen eines Projekts verursacht werden könnte. Sie können ihn nur beheben, indem Sie das Projekt entfernen und erneut hinzufügen. Ebenso Ich habe die umbenannte Klassendatei gelöscht und neu erstellt, und der Designer beginnt wieder mit der Arbeit.

1
bugged87

Das bindet mich schon seit Stunden in Knoten.

Ich habe eine VS2015-Lösung, die mehrere Jahre alt ist. Auf meinem Laptop funktioniert es wunderbar, der gesamte Code ist in TFS eingecheckt, aber als ich versuchte, ihn auf einem anderen Computer zu erstellen, wurde ständig die Meldung angezeigt, dass der Namespace nicht vorhanden ist.

Bad Namespace

Grundsätzlich ist diese RepBaseWindow eine Klasse, die von der WPF-Klasse Window geerbt wurde, mit ein paar zusätzlichen Schnickschnack.

public class RepBaseWindow : Window

Ich hatte hier eine Menge Vorschläge ausprobiert, aber kein Glück.

Die Ironie ist, dass ich trotz dieser Meldung, wenn ich mit der rechten Maustaste auf diesen fehlerhaften Link klickte und "Code anzeigen" auswählte, glücklich zu dieser Klasse gelangen würde. Der Namespace war in Ordnung, die Klasse war in Ordnung ... aber WPF war nicht glücklich darüber.

Wenn ich versuchen würde, den Namespace mit Intellisense zu finden, würde ich dasselbe Markup ... und dieselben Build-Fehler erhalten.

Ich habe die Arbeitskopie des Codes mit der TFS-Version verglichen und das Problem erkannt.

Ich musste wieder eine alte Kopie der WindowBase.dll - Datei aus dem Jahr 2012 verwenden.

Lächerlich, hey?

Die Arbeitsversion von WindowBase.dll ist 635 KB groß und wird auf der Registerkarte "Details" angezeigt:

enter image description here

Ich schreibe nur diese Antwort, um zu zeigen, dass diese Fehler manchmal absolut nichts mit fehlerhaftem WPF-Markup oder falsch geschriebenen Namespace-Namen zu tun haben.

Hoffe das hilft.

1
Mike Gledhill

Ich bin darauf gestoßen und hatte aufgrund der Antworten in diesem Forum Probleme beim Durcharbeiten. Ich hatte mein Projekt irgendwann umbenannt und einen Tippfehler in die automatisch generierte Datei AssemblyInfo.cs eingefügt (in den Feldern Assembly: AssemblyTitle und Assembly: AssemblyProduct). Überraschenderweise war dies der einzige Kompilierungsfehler, den ich als Ergebnis bekam. Nur etwas, das ein bisschen nicht offensichtlich ist, um zu überprüfen, ob Sie diesen Fehler erhalten und die vorherigen Vorschläge nicht funktionieren.

1
Dave Smash

Ich glaube, ich bin darauf gestoßen, zuerst die Ansicht zu erstellen und auf ein ViewModel zu verweisen, das es nicht gab. Danach erstelle ich das ViewModel. Fehler beim Abrufen, ViewModel konnte nicht gefunden werden.

Schließlich bemerkte ich, dass der Pfad der neu erstellten Ansichtsseite auf das Verzeichnis bin anstatt auf das Verzeichnis Views zeigte. Also habe ich ViewModel alleine gelassen. Gelöschte und neu erstellte Ansicht erneut. Klicken Sie mit der rechten Maustaste und bereinigten Sie das Projekt, schlossen Sie alle in Solution geöffneten Dateien und führen Sie einen Neuaufbau durch. Das hat es endlich geschafft.

0
ekgcorp

Ich hatte das gleiche Problem und als ich meinem ViewModel ein DEFAULT CONSTRUCTOR hinzufügte und meine Software erstellte (Strg + Umschalt + B), wurde das ViewModel im angegebenen Namespace realisiert!

0
Ehsan

In meinem Fall war die Implementierung von IValueConverter das Problem

Ich habe mich verändert:

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

zu

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

... Projekt umbauen

0