Один из возможных способов сделать это - действительно использовать EventAggregator, но с использованием фильтра для подписок.
Каждый экземпляр ViewModel будет иметь метод делегата, чтобы решить, будет ли этот экземпляр обрабатывать событие или нет. Фильтры для событий будут выполняться следующим образом:
public class MultipleViewModel
{
private IRegionManager regionManager;
public MultipleViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
{
this.regionManager = regionManager;
this.eventAggregator.GetEvent<SpecificViewModelHandledEvent>().Subscribe(SpecificViewModelEventHandler, ThreadOption.PublisherThread, false, ViewModelInstanceFilter);
}
public bool ViewModelInstanceFilter()
{
return this == this.regionManager.Regions["SpecificRegion"].GetView("ViewName").DataContext;
}
public void SpecificViewModelEventHandler()
{
// Handle the Event on the particular ViewModel instance.
}
}
Следовательно, этот метод делегата будет сравнивать текущий экземпляр ViewModel с экземпляром ViewModel, зарегистрированным в конкретном регионе. Таким образом, только этот экземпляр вернет true в фильтре и будет обрабатывать только опубликованное событие.
Дополнительную информацию можно найти в следующей главе MSDN Prism Guide:
Надеюсь, это помогло, С уважением.
ОБНОВЛЕНИЕ
Что касается вопроса комментария об обобщении решения, я хотел бы упомянуть, что более подходящая реализация могла бы быть выполнена с помощью отдельных ViewModels. В противном случае вам не нужно было бы получать один единственный экземпляр, обрабатывающий Событие. Все они должны нести одинаковую ответственность.
В любом случае, я мог бы придумать один возможный обходной путь, если более одного экземпляра зарегистрировано в одном и том же регионе: поскольку вам нужно будет идентифицировать желаемый экземпляр через все другие, пользователь может проверить или установить свойство на желаемом экземпляре представления как "отзывчивого представления", чтобы его можно было затем оценить с помощью фильтра событий .
Когда каждая ViewModel инициализируется, вы можете установить для bool Propery значение false и привязать его к его View на CheckBox strong > например ни чего похожего. Затем вы можете правильно проверить представление, в котором вы хотите обработать событие, в то время как другие экземпляры не будут отмечены, таким образом отфильтровывая опубликованное событие.
При использовании этого нового подхода вам потребуется изменить метод ViewModelInstanceFilter (), чтобы он оценивал это отмеченное свойство. И если хотите, вы можете добавить Сервис, который проверяет, что одновременно проверяется не более одного экземпляра.
Надеюсь, это вам помогло. С Уважением.
person
GOstrowsky
schedule
28.02.2014