Обычно View (включая код позади) не несет ответственности за уведомление свойств ViewModel, которые должны быть обновлены, это должно быть наоборот. Но я вижу, что в вашем случае вы хотели бы сделать определенную вещь (в этом случае получить последнее значение каждого свойства) при обработке какого-либо события, так что вот вам: некоторые решения для того, что вам нужно.
В вашей виртуальной машине определите метод, который запускает PropertyChanged для всех свойств:
public void UpdateAllProperties()
{
// Call OnPropertyChanged to all of your properties
OnPropertyChanged(); // etc.
}
Тогда в коде вашего View вам просто нужно вызвать этот метод:
// every View has a ViewModel that is bound to be View's DataContext. So cast it, and call the public method we defined earlier.
((MyViewModel)DataContext).UpdateAllProperties();
Этот подход, к сожалению, не очень элегантен для стиля MVVM. Я бы посоветовал вам сделать этот метод / обработчик событий как Bindable ICommand
. Так что вам не нужно писать какой-либо код позади, например: В вашей виртуальной машине определите ICommand
.
public ICommand UpdateAllPropertiesCommand {get; private set;}
= new Prism.Commands.DelegateCommand(UpdateAllProperties);
// You can switch the UpdateAllProperties method to private instead.
// Then remove any code behinds you had.
Затем в своем представлении (xaml) вы можете привязать ICommand
к событию определенного элемента управления.
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<!--In one of the controls-->
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding UpdateAllPropertiesCommand , Mode=OneTime}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Здесь команда будет вызываться автоматически при обработке загруженного события.