Fondamentalmente, invece di collegare il datacontext di UserControl a userControlViewModel, è meglio farlo sul primo elemento figlio del controllo utente. In questo modo, tutti i riferimenti effettuati all'interno del controllo verranno associati a userControlViewModel, ma le proprietà delle dipendenze possono essere impostate dal set di contesto dati in cui si desidera utilizzare l'UserControl.
Questo modello ha funzionato abbastanza bene per me, sul UserControl 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>
Poi sul codice dietro:
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, quello startegy si usa per legare dai genitori VM alla proprietà VM dei controlli? Potresti fare un piccolo esempio? – byte
In genere ho impostato il DataContext del controllo figlio sull'oggetto di UserCOntrolVM che è presente in ParentVM. Quindi, diciamo che hai una finestra principale all'interno della quale è presente il tuo controllo utente. Ora, il contesto dati della finestra principale è impostato su ParentVM, questo ParentVM esporrà una proprietà di tipo UserControlVM. Ora abbiamo solo bisogno di impostare il contesto dei dati del controllo utente come questo - –
akjoshi
Grazie akjoshi, io uso questa strategia nella mia applicazione e tutte le VM implementano INotifyPropertyChanged. La mia domanda riguardava più il legame di proprietà nel tuo commento "il tuo ViewModel può semplicemente implementare INotifyPropertyChanged e il tuo genitore Vm può ancora legarsi a loro." Crei i controlli VM in ParentVM e permetti a ParentVM di collegarsi direttamente ai controlli VM ?? – byte