Além da solução que outras pessoas forneceram (que são boas e corretas), há uma maneira de especificar o ViewModel em XAML, mas ainda separar o ViewModel específico da View. Separá-los é útil quando você deseja escrever casos de teste isolados.
Em 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>
Em 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
fonte
Em vez disso, tente isso.
fonte
Window
elemento, comoDataContext="VM:MainWindowViewModel"
?MarkupExtension
, nunca fez em VMs, mas você poderia fazer isso com conversores para garantir que apenas uma instância do conversor estivesse presente e chamá-lo diretamente do xaml com="{converters:SomethingConverter}"
, implicando emxmlns:converters
pontos no namespace do conversor.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()); } }
Você precisa instanciar o MainViewModel e configurá-lo como datacontext. Em sua declaração, considere-o apenas como um valor de string.
fonte
Você pode querer experimentar Catel . Ele permite que você defina uma classe DataWindow (em vez de Window), e essa classe cria automaticamente o modelo de visualização para você. Dessa forma, você pode usar a declaração do ViewModel como fez em sua postagem original, e o modelo de visualização ainda será criado e definido como DataContext.
Veja este artigo para um exemplo.
fonte
Também existe esta maneira de especificar o modelo de visualização:
<Rant>
Todas as soluções propostas anteriormente requerem que
MainViewModel
tenha um construtor sem parâmetros.A Microsoft tem a impressão de que os sistemas podem ser construídos usando construtores sem parâmetros. Se você também tiver essa impressão, vá em frente e use algumas das outras soluções.
Para quem sabe que construtores devem ter parâmetros, portanto a instanciação de objetos não pode ser deixada nas mãos de frameworks mágicos, a maneira adequada de especificar o modelo de visão que mostrei acima.
</Rant>
fonte