Другим решением было бы поставить вызов: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
в конструктор MileageFeeCalculator следующим образом:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- will be autowired when constructor is called
public MileageFeeCalculator() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
}
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile());
}
}
Существует несколько способов сделать это.
По моему опыту, самым простым методом будет # 2 , Определите событие в модели дочернего представления. Родителю придется искать ребенка (я не знаю, содержит ли он его или как создаются ваши модели представлений) и подписаться на это событие.
Стандартный способ связи между ViewModels - это использование сообщений определенного типа. Одной из хороших реализаций этого является MVVM Light Toolkit
Вот некоторый (случайный) код с использованием по умолчанию посланника по умолчанию:
//Registering:
Messenger.Default.Register<IEnumerable<BookViewModel>>(this, true, fillSourceWith);
Messenger.Default.Register<DisplayModeEnum>(this, ChangeMainTemplates);
//with a specific "token"
Messenger.Default.Register<object>(this, MessageTokens.ClearList, o => BookSource.Clear());
//Sending
Messenger.Default.Send<List<BookViewModel>>(newBooks);
Messenger.Default.Send<DisplayModeEnum>(DisplayModeEnum.MediumLayout);
Messenger.Default.Send<object>(null, MessageTokens.ClearList);
Лучший способ сделать это - иметь некоторую ссылку от дочернего на родительский и обновлять этот родительский элемент при закрытии дочернего элемента.
Или вы можете иметь какое-то событие для ребенка и позволить родителям слушать на этом мероприятии. Затем вы поднимаете это событие, когда дочерний элемент закрывается.
Сообщения используются, когда обе модели ViewModels логически несвязаны.
[rant] Не знают ли даже основные принципы ООП или что? [/ Напыщенная]
Я думаю, что лучший способ передать сообщение между двумя моделями просмотров - это программирование событий.
У меня была та же проблема за несколько дней до: -)
Наконец, я использовал медиатор для обмена обеими представлениями. По факту я использовал Messenger из MVVM Light.
public void Search(object parameter)
{
ChildWindow window = new ChildWindow();
SearchWindow pageSearch = new SearchWindow();
window.Content = pageSearch;
window.Show();
Messenger.Default.Register<Messages.CloseWindowMessage>(this, action => this.closeWindow(action));
}
После этого я определил сообщение со всем, что мне нужно было узнать из главного окна:
public class CloseWindowMessage : MessageBase
{
public bool Result { get; set; }
public Model.Selected Selected { get; set; }
}
Наконец, сообщение назад из childwindow вам нужно только зарегистрировать сообщение с результатом и объектом, который вы хотите вернуть.
Вам нужно зарегистрироваться из кода вашего представления, чтобы закрыть окно.