Как вызвать OnChangedProperty из View для всех свойств в ViewModel? - PullRequest
0 голосов
/ 02 мая 2018

В моем Page1.xaml.cs (code-behind) есть событие, которое должно изменить все свойства в моей ViewModel.

Вот пример: (Page1.xaml.cs)

public Page1()
{        
    InitializeComponent();

    example.Event += example_Event;
}

private void example_Event(...)
{ 
    // here I want to change all Properties in my ViewModel
}

Как мне этого добиться?

EDIT

У меня есть WebBrowser-Control, который отображает .ppt. Я хочу обновить все свои свойства в моей ViewModel, когда сработает это событие:

xaml.cs:

private void powerPointBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
    {
        //...
        oPPApplication.SlideShowNextSlide += ppApp_SlideShowNextSlide; //Event that gets triggered when i change the Slide in my WebBrowser-Control

    }

private void ppApp_SlideShowNextSlide(PPt.SlideShowWindow Wn)
    {
          // here i dont know how to get access to my Properties in my VM (i want to call OnChangedProperty(//for all properties in my VM))
    }

1 Ответ

0 голосов
/ 07 мая 2018

Обычно 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>

Здесь команда будет вызываться автоматически при обработке загруженного события.

...