Как вызвать событие в ViewModel из ViewModel подпредставления - PullRequest
0 голосов
/ 21 июня 2019

У меня есть приложение с основным видом, который содержит несколько подпредставлений.Представления имеют соответствующую ViewModel, которая отображает некоторые данные и события монитора, содержащиеся в моделях.

Предположим, что основное представление выглядит так:

<UserControl x:Class="MyView" Name="myView">
    <StackPanel>
        <local:MySubView Name="mySubView" someProperty="{Binding DataContext.someField, ElementName=myView}"/>
        [...]
    </StackPanel>
</UserControl>

, а вспомогательное представление выглядит так:

<UserControl x:Class="MySubView"
             prism:ViewModelLocator.AutoWireViewModel="True">
    [...]
</UserControl>

Затем в MySubViewModel.cs происходит какое-то событие и вызывается функция с параметром:

public Event EventHandler<SomeClass> MySubViewEvent;
[...]
void foo() {
    SomeClass o = new SomeClass(...);
    MySubViewEvent.Invoke(this, o);
}

Теперь, в MyViewModel.cs, у меня нет прямой ссылки наsubview и, следовательно, не может сказать что-то вроде

subViewModel.MySubViewEvent += OnSubViewEvent;

void OnSubViewEvent(object sender, SomeClass param) { ... }

Я могу добавить некоторое свойство в MySubViewModel и сделать его зависимым от некоторого поля в MyViewModel со свойством зависимости, но 1. как я могу сделать это наоборотчто некоторый обратный вызов или обработчик события будет вызываться в MyViewModel, когда событие вызывается в MySubViewModel, и 2. могу ли я как-то передать обработчики событий в качестве свойств зависимостей?

Или я должен использовать для этого что-то еще, кроме DependencyProperties?

Какой самый эффективный способ добиться этого?

1 Ответ

2 голосов
/ 21 июня 2019

Пример учебника по использованию EventAggregator, хотя я должен добавить, что модели дочерних представлений также являются примером учебника для перехода к модели сначала. ViewModelLocator наиболее полезен для независимых представлений верхнего уровня ...

Это, как говорится, в подвидовой модели:

_eventAggregator.GetEvent<MySubViewEvent>().Publish();

Где-то еще:

public MainViewModel( IEventAggregator eventAggregator )
{
    eventAggregator.GetEvent<MySubViewEvent>().Subscribe( OnSubViewEvent );
}
...