Я не знаю, как правильно создать отношение Viewmodel, если Я использую подход, согласно которому Views создает экземпляры ViewModel, а ViewModel не имеет ссылки на View.
Предположим,у нас есть элемент управления ChildView, который создает экземпляр его ViewModel с SaveCommand.
<UserControl x:Class="App.ChildView" ...>
<UserControl.DataContext>
<local:ChildViewModel/>
</UserControl.DataContext>
<!-- some controls -->
</UserControl>
public class ChildViewModel
{
public RelayCommand SaveCommand { get; set; }
public ChildViewModel()
{
SaveCommand = new RelayCommand(SaveExecute);
}
private void SaveExecute()
{
Debug.WriteLine("Child data has been saved.");
}
}
Теперь я помещаю два элемента управления в родительское представление и хочу выполнить SaveCommand для всех дочерних элементов.
<Window x:Class="App.ParentView" ...>
<Window.DataContext>
<local:ParentViewModel/>
</Window.DataContext>
<Grid>
<local:ChildView x:Name="child1"/>
<local:ChildView x:Name="child2"/>
<Button Content="Save All" Command="{Binding ParentSaveCommand}">
<Grid/>
</Window>
public class ParentViewModel
{
public RelayCommand ParentSaveCommand { get; set; }
public ParentViewModel()
{
ParentSaveCommand = new RelayCommand(ParentSaveExecute);
}
private void ParentSaveExecute()
{
Debug.WriteLine("Saving all has started...");
// <childVM1>.SaveCommand.Execute();
// <childVM2>.SaveCommand.Execute();
// From where should I get ChildViewModel?
}
}
Как правильно я должен ссылаться на дочернюю ViewModel?
Я нашел возможные решения:
- Добавить интерфейс к ParentView, который возвращает дочернюю ViewModel ( как AngelSix сделал с паролем )
- Создайте класс, который сможет связывать ChildView.DataContext со свойством ParentView.DataContext.Child1ViewModel.
.
Или, может быть, это неправильный подход, и ParentViewModel должен создавать экземпляры ChildViewModel, а затем ParentView должен устанавливать DataContext для child1 и child2 (путем связывания, конечно)?