Sto provando a far funzionare la mia prima app WPF utilizzando MVVM e ho riscontrato un piccolo problema di associazione.WPF: impostazione DataContext di un UserControl con Binding non funzionante in XAML
La messa a punto è che ho una visione & ViewModel che detiene i dettagli utente (il genitore), e per cercare di mantenere le cose semplici ho messo una sezione di quella vista in una vista separata & ViewModel (il bambino). La vista figlio è definita come UserControl.
Il problema riscontrato è come impostare DataContext della vista figlio (UserControl). Il mio genitore ViewModel ha una proprietà che espone il bambino ViewModel, in questo modo:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
In XAML per la mia vista padre (che ha il DataContext insieme al ParentViewModel), cerco di impostare il DataContext della vista del bambino come segue:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Tuttavia, questo non funziona. Il DataContext della vista figlio è impostato sullo stesso DataContext della vista padre (ad esempio ParentViewModel), come se non lo avessi impostato. Ho anche provato a installare il DataContext nel bambino visualizzare stessa, che anche non funziona:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
ho trovato un paio di modi per aggirare questo. Dal punto di vista del bambino, posso legare tutto includendo il ChildViewModel nel percorso:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
ma io non voglio la vista bambino ad avere questo livello di consapevolezza della gerarchia. Impostazione del DataContext nel codice funziona anche - tuttavia, che devo fare questo dopo che mostra la vista padre, altrimenti il DataContext appena viene sovrascritto quando chiamo Show():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Questo codice mi fa anche sentire a disagio, cosa con la violazione LOD e tutti.
E 'solo il DataContext che sembra essere il problema - posso legare le altre cose nel bambino, per esempio ho provato vincolante il FontSize a una proprietà int solo per testarlo:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
e che funziona bene.
Ma sono sicuro che il DataContext dovrebbe funzionare: ho visto esempi simili di questo genere di cose. Ho perso qualcosa di ovvio qui? C'è una ragione per cui questo non funzionerà? C'è un errore di ortografia da qualche parte? (Ho ribattezzato le cose per il tuo beneficio, quindi non sarai in grado di aiutarmi comunque).
Qualsiasi pensiero benvenuto.
Modifica
Rivedere di nuovo questo codice, sembra che abbia fatto un errore da qualche parte, come il seguente XAML in vista padre risulta attualmente al lavoro:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Sono non sono sicuro del motivo per cui non sono riuscito a farlo funzionare in origine, o cosa avrei potuto cambiare per farlo funzionare. Forse era il problema INotifyPropertyChanged come suggerisce una delle risposte. Oh bene, in avanti e verso l'alto ..
Buon pensiero, ma nessuna gioia ho paura. Stavo pensando che potrebbe essere qualcosa a che fare con l'ordine, ma il bambino viewModel dovrebbe essere disponibile quando avviene l'associazione - e funziona quando imposto la dimensione del carattere utilizzando la proprietà int, che accade nello stesso momento, e che non lo fa t usare PropertyChanged. –