Estoy tratando de que mi primera aplicación WPF funcione usando MVVM, y he tenido un pequeño problema de enlace.WPF: Configuración de DataContext de un UserControl con Enlace no funciona en XAML
La configuración es que tengo una vista & modelo de vista que mantiene los detalles de los usuarios (los padres), y para tratar de mantener las cosas simples que he puesto una sección de esa visión en una vista separada & modelo de vista (el niño). La vista secundaria se define como un UserControl.
El problema que tengo es cómo configurar el DataContext de la vista secundaria (UserControl). Mi padre modelo de vista tiene una propiedad que expone al niño modelo de vista, así:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
En el XAML para mi vista padre (que tiene su DataContext conjunto a la ParentViewModel), trato de establecer el DataContext de la vista del niño de la siguiente manera:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Sin embargo, esto no funciona. El DataContext de la vista secundaria está configurado con el mismo DataContext que la vista principal (es decir, el ParentViewModel), como si no lo estuviera configurando en absoluto. También probé establecer el DataContext en el niño ver en sí, que tampoco funciona:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
he encontrado un par de maneras de evitar esto. En la vista del niño, puedo unir todo mediante la inclusión de la ChildViewModel en la ruta:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
pero no quiero la vista hijo tenga este nivel de conciencia de la jerarquía. Ajuste de la DataContext en el código también funciona - sin embargo, tengo que hacer esto después de mostrar la vista padre, de lo contrario el DataContext simplemente se sobreescribe cuando llamo Show():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Este código también me hace sentir incómoda, lo con la violación de LOD y todo.
Es sólo el DataContext que parece ser el problema - me puedo unir otras cosas en el niño, por ejemplo, he intentado unir el Tamaño de Letra a una propiedad int sólo para probarlo:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
y que funciona multa.
Pero estoy seguro de que el enlace del DataContext debería funcionar; he visto ejemplos similares de este tipo de cosas. ¿Me he perdido algo obvio aquí? ¿Hay alguna razón por la que esto no funcione? ¿Hay algún error ortográfico en alguna parte? (Cambié el nombre de las cosas para su beneficio, así que no podrá ayudarme allí de todos modos).
Cualquier idea bienvenida.
Editar
Revisando el código de nuevo, parece que he cometido un error en alguna parte, como el siguiente XAML en la vista padre hace ahora parece funcionar:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
estoy no estoy seguro de por qué no pude hacer que funcione originalmente, o lo que podría haber cambiado para que funcione. Tal vez fue el problema INotifyPropertyChanged como sugiere una de las respuestas. Oh, bueno, hacia adelante y hacia arriba ...
Buena idea, pero no me alegra, me temo. Estaba pensando que podría ser algo relacionado con el orden, pero el viewModel hijo debería estar disponible cuando se produce la vinculación, y funciona cuando configuro el tamaño de fuente con la propiedad int, que ocurre al mismo tiempo, y eso no funciona. t usa PropertyChanged. –