Básicamente, en lugar de vincular el contexto de datos de UserControl al userControlViewModel, es mejor hacerlo en el primer elemento secundario del control de usuario. De esta forma, todas las referencias que realice dentro del control estarán vinculadas a userControlViewModel, pero las propiedades de las dependencias se pueden configurar desde el contexto de datos en el que desea usar UserControl.
Este modelo ha funcionado bastante bien para mí, en el control de usuario XAML:
<UserControl x:Class="Six_Barca_Main_Interface.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Six_Barca_Main_Interface"
xmlns:System="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
d:DesignHeight="900" d:DesignWidth="900">
<DockPanel x:Name="rootDock" >
<TextBlock>{Binding SomethingInMyUserControlViewModel}</TabControl>
</DockPanel>
</UserControl>
Luego, en el código detrás:
public partial class MyUserControl : UserControl
{
UserControlViewModel _vm;
public MyUserControl()
{
InitializeComponent();
//internal viewModel set to the first child of MyUserControl
rootDock.DataContext = new UserControlViewModel();
_vm = (UserControlViewModel)rootDock.DataContext;
//sets control to be able to use the viewmodel elements
}
#region Dependency properties
public string textSetFromApplication
{
get{return (string)GetValue(textSetFromApplicationProperty);}
set{SetValue(textSetFromApplicationProperty, value);}
}
public static readonly DependencyProperty textSetFromApplicationProperty = DependencyProperty.Register("textSetFromApplication", typeof(string), typeof(MyUserControl), new PropertyMetadata(null, OnDependencyPropertyChanged));
private static void OnDependencyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyUserControl)d)._vm.SomethingInMyUserControlViewModel =
e.NewValue as string;
}
#endregion
hi akjoshi, lo startegy usas para obligar a los padres VM a los controles de propiedad VM? ¿Podría dar un pequeño ejemplo? – byte
Genralmente configuré el DataContext del control secundario al objeto de UserCOntrolVM que está presente en ParentVM. así que supongamos que tiene una ventana principal dentro de la cual su control de usuario está presente. Ahora, el contexto de datos de la ventana principal está configurado como ParentVM, este ParentVM expondrá una propiedad de tipo UserControlVM. Ahora solo tenemos que establecer el contexto de datos del control de usuario así: –
akjoshi
Gracias akjoshi, utilizo esta estrategia en mi aplicación y todas las VM implementan INotifyPropertyChanged. Mi pregunta era más sobre la vinculación de propiedades en su comentario "su ViewModel puede implementar INotifyPropertyChanged y su Vm padre aún puede vincularse a ellos". ¿Creas la VM de controles en ParentVM y dejas que ParentVM se enlace directamente a la VM de controles? – byte