Я пытаюсь заставить свое первое приложение WPF работать с использованием MVVM, и у меня возникла небольшая проблема с привязкой.
Настройка заключается в том, что у меня есть view & viewModel, в которой хранятся данные пользователя (родитель), и, чтобы попытаться упростить задачу, я поместил раздел этого представления в отдельный view & viewModel (дочерний элемент). Дочернее представление определяется как UserControl.
У меня проблема в том, как установить DataContext дочернего представления (UserControl). Мой родительский ViewModel имеет свойство, которое предоставляет дочерний ViewModel, например:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
В XAML для моего родительского представления (для которого для DataContext установлено значение ParentViewModel) я пытаюсь установить DataContext дочернего представления следующим образом:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Однако это не работает. DataContext дочернего представления установлен на тот же DataContext, что и родительское представление (то есть ParentViewModel), как если бы я его не устанавливал вообще. Я также попытался установить DataContext в самом дочернем представлении, которое также не работает:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
Я нашел несколько способов обойти это. В дочернем представлении я могу связать все, включив ChildViewModel в путь:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
но я не хочу, чтобы у дочернего представления был такой уровень понимания иерархии. Установка DataContext в коде также работает - однако я должен сделать это после показа родительского представления, в противном случае DataContext просто перезаписывается при вызове Show ():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Этот код также заставляет меня чувствовать себя неловко, что с нарушением LOD и все.
Кажется, проблема в DataContext - я могу связать другие вещи в дочернем элементе, например, я пытался связать FontSize со свойством int просто для его проверки:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
И это прекрасно работает.
Но я уверен, что связывание DataContext должно работать - я видел похожие примеры такого рода вещей. Я что-то упустил здесь очевидное? Есть ли причина, по которой это не сработает? Где-нибудь есть орфографическая ошибка? (Я переименовал вещи в вашу пользу, так что вы все равно не сможете мне там помочь).
Любые мысли приветствуются.
Редактировать
Повторно просматривая этот код, кажется, я где-то допустил ошибку, поскольку следующий XAML в родительском представлении теперь работает:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Я не уверен, почему я не смог заставить его работать изначально или что я мог изменить, чтобы заставить его работать. Возможно, это была проблема INotifyPropertyChanged, как предполагает один из ответов. Ну что ж, вперед и вверх ..