Проблема здесь не в уровне класса StaffViewModel
, а в уровне страницы. Когда вы делаете:
staffVM = staffListView.SelectedItem as StaffViewModel;
Пользовательский интерфейс не уведомляет о том, что поле staffVM
изменилось. Таким образом, привязка все еще указывает на старый экземпляр StaffViewModel
. Следовательно, когда вы делаете staffVM.Update()
, он уведомляет об изменениях, но пользовательский интерфейс не прослушивает этот экземпляр - он все еще прослушивает уведомления о первом выбранном элементе. Bindings.Update()
исправляет это, потому что он полностью переоценивает все привязки, поэтому он "получит" новое значение поля staffVM
.
Решением будет реализация INotifyPropertyChanged
в Page
и инкапсуляция staffVM
в свойстве, которое вызывает событие PropertyChanged
.
В идеале я бы предложил создать модель «корневого» представления, которую вы зададите только один раз и которая не изменится, и которая будет содержать выбранный элемент в качестве его свойства. Таким образом, вам не нужно реализовывать INotifyPropertyChanged
в Page
, и его код будет проще. В результате у вас будет что-то вроде следующего в коде:
public RootViewModel VM {get;} = new RootViewModel();
И в XAML:
<TextBlock Text="{x:Bind VM.SelectedStaff.Name, Mode=OneWay}"/>