Вы можете использовать EventAggregators для достижения этой цели.
Для незнакомых людей Event Aggregator - это сервис, который предоставляет
возможность публикации объекта от одного объекта к другому в
свободно основанная мода.
Подробнее об агрегаторах событий можно прочитать здесь
Вы начинаете с определения своего CustomMessage, которое будет содержать сообщение для передачи.
public class CustomMessage
{
public string String1 { get; set; }
}
Теперь вы переходите к ParentViewModel и создаете экземпляр агрегатора событий.
private IEventAggregator _eventAggregator;
[ImportingConstructor]
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
В установщике вашего свойства, которое связано с вашим текстовым полем, вы теперь добавили бы код для публикации сообщения с помощью Event Aggregator.
Например,
public string String1
{
get => _string1;
set
{
if (_string1.Equals(value)) return;
_string1 = value;
_eventAggregator.PublishOnUIThread(new CustomMessage
{
String1 = _string1,
});
}
}
Теперь вы переходите к своей модели просмотра ребенка и подписываетесь на агрегатор событий.
private IEventAggregator _eventAggregator;
[ImportingConstructor]
public SecondWinViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
Чтобы подписаться на конкретное сообщение (в данном случае CustomMessage), вам необходимо реализовать интерфейс IHandle.
[Export(typeof(SecondWinViewModel))]
public class SecondWinViewModel : Screen, IHandle<CustomMessage>
Для интерфейса требуется один метод, который вы бы использовали для получения сообщения и обновления требуемого свойства в вашем дочернем окне.
public void Handle(CustomMessage message)
{
String1 = message.String1;
NotifyOfPropertyChange(nameof(String1));
}
Вы можете сделать то же самое для нескольких параметров, добавив дополнительные свойства в ваше CustomMessage. Таким же образом вы можете передавать сообщения из Child Vm в Parent Vm.