Я создаю приложение WPF с помощью инструментария MVVMLight. У меня есть «родительская» форма (ParentView) и вы хотите загрузить «дочернюю» форму (ChildView), передав «родительский» объект (родительский), который будет загружать все «дочерние» объекты.Использование ICommand и ServiceLocator для передачи родительского объекта для загрузки дочерних объектов способом MVVM
Я включил фрагменты кода из 3 основных классов, которые я считаю важными в чьем-либо анализе: ViewModelLocator, ChildViewModel, ParentViewModel. Первоначально я думал о реализации свойства ICommand в ParentViewModel, создавая экземпляр ParentView (см. Ниже), но это не кажется правильным, поскольку я пытаюсь сделать это с помощью MVVM. Может ли кто-нибудь помочь со следующей структурой и как передать родителя ребенку?
// ----- ChildViewModel -----
public class ChildViewModel
{
// this ctor doesn't make sense in the MVVM world, right?...
public ChildViewModel(Parent selectedParent)
{
this.Parent = selectedParent;
// ...
}
// how do I plug into this one?...
public ChildViewModel(IParentService parentService)
{
this.ParentService = parentService
// ...
}
// ... removed other code for brevity
}
// ----- ParentViewModel -----
{
public ICommand ShowChildCommand
{
get { return new RelayCommand(() => new ChildView(SelectedParent).Show()); }
}
// ... removed other code for brevity
}
// ----- ViewModelLocator -----
public class ViewModelLocator
{
public ChildModel ChildViewModel
{
get { return ServiceLocator.Current.GetInstance<ChildViewModel>(); }
}
public ParentModel ParentViewModel
{
get { return ServiceLocator.Current.GetInstance<ParentViewModel>(); }
}
public ViewModelLocator()
{
SimpleIoc.Default.Register<IChildService, ChildService>();
SimpleIoc.Default.Register<IParentService, ParentService>();
// ... removed other code for brevity
SimpleIoc.Default.Register<ChildViewModel>();
SimpleIoc.Default.Register<ParentViewModel>();
}
// ... removed other code for brevity
}
// ------ ПЕРЕСМОТР 2 редактирует ------------
я включил последние предложения от пользователя @kidshaw, но я сбит с толком комментарий, в котором я должен был создать экземпляр ChildView в ParentView. Я не уверен, как это сделать. Я снова прочитал статью MSDN о Messenger, но не вижу, как это может помочь мне в этом вопросе. Я включил следующий последний код. Пожалуйста, обратитесь к комментариям.
public class ParentViewModel
{
public ICommand ShowChildCommand
{
get { return new RelayCommand(OnLoadChildCommand); }
}
private void OnLoadChildCommand()
{
Messenger.Default.Send(new ParentToChildMessage { Parent = this.CurrentParent });
// ****** this is where I instantiated the child view
// I am sure this is wrong...
var view = new ChildView().Show();
}
public class ParentToChildMessage : MessageBase
{
public Parent Parent { get; set; }
}
...
}
И ChildViewModel выглядит следующим образом:
public class ChildViewModel
{
public ChildViewModel(IChildService service)
{
this.ServiceProxy = service;
this.MessengerInstance.Register<ParentViewModel.ParentToChildMessage>(this, this.OnParentToChildMessage);
this.ChildCollection = new ObservableCollection<Child>();
GetChildInfo(this.CurrentParent);
}
}
Создайте экземпляр childview в своем родительском представлении. Просмотр является xaml. Я предлагаю вам добавить экземпляр вашего дочернего элемента управления к родительскому объекту, так что он будет создан одновременно. – kidshaw