Отправка сообщения конкретному экземпляру модели представления в регионе

Я использую призму и WPF. У меня есть представление, которое может иметь несколько экземпляров с соответствующими моделями представления. Проблема в том, что мне нужно что-то сделать на основе некоторого события в модели просмотра для конкретного экземпляра, который размещен в определенном регионе. Я думаю использовать агрегатор событий для подписки на событие, проблема в том, что каждое создание модели представления будет подписываться на одно и то же событие, и при публикации каждое из них получит одно и то же событие, которое я не хочу, но хочу, чтобы только экземпляр, размещенный в регионе, получал сообщение и процесс и другие игнорировать его.

Вкратце, я хочу отправлять сообщение только модели просмотра пользовательского элемента управления, которая размещена в определенном регионе, даже если пользовательский элемент управления размещен в любом другом регионе.


person This Coder    schedule 28.02.2014    source источник


Ответы (1)


Один из возможных способов сделать это - действительно использовать 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 например ни чего похожего. Затем вы можете правильно проверить представление, в котором вы хотите обработать событие, в то время как другие экземпляры не будут отмечены, таким образом отфильтровывая опубликованное событие.

При использовании этого нового подхода вам потребуется изменить метод ViewModelInstanceFilter (), чтобы он оценивал это отмеченное свойство. И если хотите, вы можете добавить Сервис, который проверяет, что одновременно проверяется не более одного экземпляра.

Надеюсь, это вам помогло. С Уважением.

person GOstrowsky    schedule 28.02.2014
comment
Спасибо за решение. Это подойдет для конкретного сценария. Можете ли вы предложить для этого обобщенное решение? например, как связать два конкретных экземпляра модели представления? находятся ли они в разных регионах или в одних и тех же регионах. Спасибо. - person This Coder; 28.02.2014
comment
... Подобно представлению A необходимо отправить сообщение / событие в один из многих открытых экземпляров представления B через его модель представления. - person This Coder; 28.02.2014
comment
Привет, Абдул, я обновил ответ обобщенным сценарием. Обратите внимание, как я объяснил выше, что другой подход с разделенными View / ViewModels, я имею в виду, что это не один и тот же класс, мог быть более подходящим для этого сценария. С Уважением. - person GOstrowsky; 28.02.2014