Sé que esto es un viejo, respondió a la pregunta, pero tengo un enfoque diferente. Me gusta establecer relaciones implícitas en la aplicación.Archivo xaml:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
Con esto, no hay necesidad de configurar un DataContext en ningún lado.
ACTUALIZACIÓN >>>
En respuesta a la petición de @Vignesh Natraj, aquí hay una explicación más completa:
Una vez que haya configurado el DataTemplate
en un elemento de Resources
, se puede visualizar el KioskView
en este ejemplo agregando una instancia de KioskViewModel
en cualquier parte de su XAML. Esto podría estar llenando el MainWindow
, o solo dentro de una sección particular de la pantalla. También puede alojar varias instancias del KioskViewModel
en un ListBox
y generará varias instancias KioskView
.
Puede agregar una instancia de KioskViewModel
a su XAML de varias maneras, dependiendo de sus requisitos. Una forma es declarar el espacio de nombres XML para el proyecto que contiene el archivo KioskViewModel.cs
y simplemente agregar una instancia en un ContentControl
a la página donde desea que aparezca su vista. Por ejemplo, si has tenido una UserControl
llamada MainView
y el archivo KioskViewModel.cs
estaba en un espacio de nombres Kiosk.ViewModels
, podría utilizar XAML básico como esto:
<UserControl x:Class="Kiosk.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Kiosk.ViewModels">
<UserControl.Resources>
<ViewModels:KioskViewModel x:Key="KioskViewModel" />
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</UserControl.Resources>
<ContentControl Content="{StaticResource KioskViewModel}" />
</UserControl>
que prefieren utilizar el patrón de diseño MVVM con WPF, por lo que tendría una clase de modelo de vista base que proporciona una funcionalidad útil, como la implementación de la interfaz esencial INotifyPropertyChanged
. Luego tengo una propiedad llamada ViewModel
en el modelo de vista principal (nivel superior) del tipo BaseViewModel
. Esto me proporciona una buena manera de cambiar la propiedad ViewModel
a cualquier modelo de vista que se haya derivado de BaseViewModel
y, por lo tanto, de poder cambiar la vista asociada desde el modelo de vista.
Por ejemplo, en la clase MainViewModel.cs
que está obligado a MainView
hay un campo y bienes relacionados:
private BaseViewModel viewModel = new KioskViewModel();
public BaseViewModel ViewModel
{
get { return viewModel; }
set { viewModel = value; NotifyPropertyChanged("ViewModel"); }
}
Como se puede ver, que comienza como una instancia KioskViewModel
, pero se puede cambiar a cualquier otra vista en cualquier momento en respuesta a la interacción del usuario. Para esta configuración, el XAML es muy similar, pero en lugar de declarar una instancia del modelo de vista en el elemento Resources
, que se unen a la propiedad en el MainViewModel
:
<UserControl x:Class="Kiosk.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Kiosk.ViewModels">
<ContentControl Content="{Binding ViewModel}" />
</UserControl>
Tenga en cuenta que para este ejemplo, necesitaríamos para declarar dos (o más para que este enfoque sea útil) DataTemplate
s en el archivo App.xaml
:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
¿No necesitamos ninguna propiedad (propiedad de dependencia o propiedad normal) ... en la etiqueta de contenido? ... ¿O cómo "Actual" satisface lo mismo? – Relativity
Hola Thomas, ¿Puedes darme una idea sobre la consulta anterior? – Relativity
En el código anterior, 'Current' sería una propiedad del contexto de datos, de tipo' MyViewModel' –