En plus de la solution fournie par d'autres personnes (qui sont bonnes et correctes), il existe un moyen de spécifier le ViewModel en XAML, tout en séparant le ViewModel spécifique de la vue. Les séparer est utile lorsque vous souhaitez écrire des cas de test isolés.
Dans 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>
Dans 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
la source
Essayez plutôt ceci.
la source
Window
élément, commeDataContext="VM:MainWindowViewModel"
?MarkupExtension
, jamais fait sur les VM, mais vous pouvez le faire avec des convertisseurs pour vous assurer qu'une seule instance du convertisseur est présente et l'appeler directement depuis xaml avec="{converters:SomethingConverter}"
, ce qui implique desxmlns:converters
points sur l'espace de noms du convertisseur.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 devez instancier le MainViewModel et le définir comme datacontext. Dans votre déclaration, il suffit de le considérer comme une valeur de chaîne.
la source
Vous voudrez peut-être essayer Catel . Il vous permet de définir une classe DataWindow (au lieu de Window), et cette classe crée automatiquement le modèle de vue pour vous. De cette façon, vous pouvez utiliser la déclaration du ViewModel comme vous l'avez fait dans votre publication d'origine, et le modèle de vue sera toujours créé et défini comme DataContext.
Consultez cet article pour un exemple.
la source
Il existe également cette façon de spécifier le viewmodel:
<Rant>
Toutes les solutions proposées précédemment nécessitent de
MainViewModel
disposer d'un constructeur sans paramètre.Microsoft a l'impression que les systèmes peuvent être construits à l'aide de constructeurs sans paramètres. Si vous êtes également sous cette impression, allez-y et utilisez certaines des autres solutions.
Pour ceux qui savent que les constructeurs doivent avoir des paramètres, et donc l'instanciation des objets ne peut pas être laissée entre les mains de cadres magiques, la bonne façon de spécifier le modèle de vue de celui que j'ai montré ci-dessus.
</Rant>
la source