Zusätzlich zu der von anderen Personen bereitgestellten Lösung (die gut und korrekt ist) gibt es eine Möglichkeit, das ViewModel in XAML anzugeben und dennoch das spezifische ViewModel von der Ansicht zu trennen. Das Trennen ist nützlich, wenn Sie isolierte Testfälle schreiben möchten.
In App.xaml:
<Application
x:Class="BuildAssistantUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"
StartupUri="MainWindow.xaml"
>
<Application.Resources>
<local:MainViewModel x:Key="MainViewModel" />
</Application.Resources>
</Application>
In MainWindow.xaml:
<Window x:Class="BuildAssistantUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{StaticResource MainViewModel}"
/>
Merlyn Morgan-Graham
quelle
Versuchen Sie dies stattdessen.
quelle
Window
Element festzulegen, zDataContext="VM:MainWindowViewModel"
.MarkupExtension
, haben es nie auf VMs gemacht, aber Sie könnten es mit Konvertern machen, um sicherzustellen, dass nur eine Instanz des Konverters vorhanden ist, und es direkt von xaml mit aufrufen="{converters:SomethingConverter}"
, wasxmlns:converters
Punkte im Konverter-Namespace impliziert .public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter where T : class, new() { private static T _converter; public override object ProvideValue(IServiceProvider serviceProvider) { return _converter ?? (_converter = new T()); } }
Sie müssen das MainViewModel instanziieren und als Datenkontext festlegen. In Ihrer Anweisung wird es nur als Zeichenfolgenwert betrachtet.
quelle
Vielleicht möchten Sie Catel ausprobieren . Sie können eine DataWindow-Klasse (anstelle von Window) definieren, und diese Klasse erstellt automatisch das Ansichtsmodell für Sie. Auf diese Weise können Sie die Deklaration des ViewModel wie in Ihrem ursprünglichen Beitrag verwenden, und das Ansichtsmodell wird weiterhin erstellt und als DataContext festgelegt.
In diesem Artikel finden Sie ein Beispiel.
quelle
Es gibt auch folgende Möglichkeit, das Ansichtsmodell anzugeben:
<Rant>
Alle zuvor vorgeschlagenen Lösungen erfordern
MainViewModel
einen parameterlosen Konstruktor.Microsoft hat den Eindruck, dass Systeme mit parameterlosen Konstruktoren erstellt werden können. Wenn Sie auch unter diesem Eindruck stehen, verwenden Sie einige der anderen Lösungen.
Für diejenigen, die wissen, dass Konstruktoren Parameter haben müssen und daher die Instanziierung von Objekten nicht in den Händen magischer Frameworks liegen kann, ist dies die richtige Methode, um das Ansichtsmodell des oben gezeigten anzugeben.
</ Rant>
quelle