Comment puis-je configurer un ViewModel sur une fenêtre en XAML à l'aide de DataContext de la propriété?
La question dit à peu près tout.
J'ai une fenêtre, et ont essayé de définir le DataContext utilisation totale de l'espace de noms pour le ViewModel, mais j'ai l'impression de faire quelque chose de mal.
<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="BuildAssistantUI.ViewModels.MainViewModel">
Vous devez vous connecter pour publier un commentaire.
En plus de la solution que les autres personnes fournie (qui sont bonnes, et de corriger), il y a un moyen de spécifier le ViewModel dans le code XAML, mais toujours séparés spécifiques ViewModel de la Vue. En les séparant est utile lorsque vous voulez écrire isolées de cas de test.
Dans L'App.xaml:
Dans MainWindow.xaml:
Essayez plutôt ceci.
Window
élément, commeDataContext="VM:MainWindowViewModel"
?MarkupExtension
, jamais fait sur des machines virtuelles, mais vous pourriez le faire avec des convertisseurs pour s'assurer qu'une seule instance de convertisseur est présent et de l'appeler directement à partir de xaml avec="{converters:SomethingConverter}"
, ce qui impliquexmlns:converters
points au convertisseur d'espace de noms.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()); } }
Vous avez besoin d'instancier la MainViewModel et le définir comme datacontext. Dans votre déclaration il est juste de le considérer comme chaîne de valeur.
Vous pourriez vouloir essayer Catel. Il permet de définir une DataWindow classe (au lieu de la Fenêtre), et que la classe crée automatiquement le modèle de vue pour vous. De cette façon, vous pouvez utiliser la déclaration de ce Dernier comme vous l'avez fait dans votre post original, et le modèle de vue sera toujours créé et défini comme DataContext.
Voir cet article pour un exemple.