Además de la solución que proporcionaron otras personas (que es buena y correcta), hay una manera de especificar ViewModel en XAML, pero aún así separar el ViewModel específico de la View. Separarlos es útil cuando desea escribir casos de prueba aislados.
En 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>
En 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
fuente
Prueba esto en su lugar.
fuente
Window
elemento, comoDataContext="VM:MainWindowViewModel"
?MarkupExtension
, nunca lo hizo en máquinas virtuales, pero podría hacerlo con convertidores para asegurarse de que solo haya una instancia del convertidor y llamarlo directamente desde xaml con="{converters:SomethingConverter}"
, lo que implicaxmlns:converters
puntos en el espacio de nombres del convertidor.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()); } }
Debe crear una instancia de MainViewModel y configurarlo como datacontext. En su declaración, simplemente considérelo como un valor de cadena.
fuente
Quizás quieras probar Catel . Le permite definir una clase DataWindow (en lugar de Window), y esa clase crea automáticamente el modelo de vista por usted. De esta manera, puede usar la declaración de ViewModel como lo hizo en su publicación original, y el modelo de vista aún se creará y establecerá como DataContext.
Consulte este artículo para ver un ejemplo.
fuente
También existe esta forma de especificar el modelo de vista:
<Rant>
Todas las soluciones propuestas anteriormente requieren que
MainViewModel
deba tener un constructor sin parámetros.Microsoft tiene la impresión de que los sistemas se pueden construir utilizando constructores sin parámetros. Si también tiene esa impresión, siga adelante y use algunas de las otras soluciones.
Para aquellos que saben que los constructores deben tener parámetros y, por lo tanto, la instanciación de objetos no puede dejarse en manos de marcos mágicos, la forma adecuada de especificar el modelo de vista del que mostré anteriormente.
</Rant>
fuente