2015-08-19 10 views
7

Ich beginne eine WPF-Anwendung. Ich benutze Prism und seine ViewLocator.Prism ViewLocator: Wie zu beheben "Ihre Ansichten müssen IView implementieren"

Es impliziert, dass, wenn ich einen Blick haben, dass ein ViewModel gebunden, um es zu haben hat, ich habe mvvm:ViewModelLocator.AutoWireViewModel="True" auf, um anzuzeigen, und es implementiert die IView Schnittstelle zu machen, die ich hinter im Code tat.

In meiner kleinen Testanwendung funktioniert alles gut, ich bekomme mein ViewModel, es ist auf den DataContext meiner View eingestellt.

Das Problem ist, dass Everyplace ich die mvvm:ViewModelLocator.AutoWireViewModel="True" bin mit, ich diesen Fehler in der „Fehlerliste“ erhalten:

„Ihre Ansichten müssen IView implementieren“

Von meinem Verständnis, das Problem ist, dass Der XAML-Editor scheint nicht zu überprüfen, ob mein Code hinter der Klasse diese Schnittstelle implementiert.

Also, wie um diesen Fehler zu vermeiden?

Antwort

1

Der XAML-Editor gibt eine Fehlermeldung aus, wenn Sie Ihr Ansichtsmodell in XAML finden. Sie können stattdessen den Job im Code hinterher tun:

public MainWindow() { 
    InitializeComponent(); 
    ViewModelLocationProvider.AutoWireViewModelChanged(this); 
} 

Dann wird keine Fehlermeldung angezeigt.

+1

Vielen Dank, aber wir mögen eine Menge zu sein in der Lage, zur Entwurfszeit, in der XAML zu sehen, welche Benutzersteuerung AutoWired ist – J4N

3

In der Tat Prism 6, die noch ein IView die mit der Notwendigkeit, entfernen gerade veröffentlicht wurde, so dass Sie diese Nachricht haben nicht mehr :)

+0

IView ist nicht in Prism 6 und es wird nicht mehr benötigt. – Elangesh

1

Wenn Sie Prism 6 nicht aktualisieren wollen , hier ist die Lösung.

Nehmen Sie die source code of the ViewModelLocator class und in der AutoWireViewModelChanged Methode entfernen Sie diese Zeile:

// throw new Exception("Your views must implement IView"); 

Ändern Sie den Namensraum dieser Klasse zu Ihrem Namensraum:

// namespace Microsoft.Practices.Prism.Mvvm 
namespace MyNamespace 

Und in XAML verwenden diese Eigenschaft statt der von Prism:

<Page 
    xmlns:my="using:MyNamespace" 
    my:ViewModelLocator.AutoWireViewModel="True">