как получить ответы от других Viewmodel - PullRequest
0 голосов
/ 18 мая 2011

SL4 VS2010 MVVM-light c #, мессенджер.

  1. У меня есть родительский вызов userControl дочерний пользовательский контроль. (как есть ViewModels)

  2. Я использую мессенджер от MVVM-light. (Дочерний элемент является пользовательским контролем во вкладке родительского элемента)

  3. Когда ребенку нужно закрыть, мы должны проверить определенные правила для parent-ViewModel (родительский результат вы можете закрыть не).

Как бы вы связали parent-ViewModel с child-ViewModel?

сообщение от ребенка к родителю, спрашивающее, можно ли закрыть? затем сообщите родителю ребенку, что нужно вернуть «да» или «нет», вы можете

(мне? Не нравится переписываться дважды)

что я действительно хочу знать, так это то, есть ли какой-либо другой способ предварительно связать подобное с ViewModels?

или как насчет затемнения кнопки закрытия на дочернем элементе, если родительские правила не позволяют дочернему элементу закрываться.

Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

Вы должны иметь возможность использовать Messenger в MVVM-Light для выполнения этой задачи.

Дочернее окно публикует уведомление мессенджера, как показано ниже

var message = new NotificationMessageAction<bool>("CanClose", CloseCallback);
Messenger.Default.Send(message);

Вы можете определить обратный вызов Actionкак показано ниже

private void CloseCallback(bool result)
{
    if (result)
        ... do some work and close, may need to use Dispatcher ...
}

Вы можете подписаться на это уведомление для родителя, как показано ниже

Messenger.Default.Register<NotificationMessageAction<string>>(
   this,
   msg =>
      {
           if (msg.Notification == "CanClose")
               {
                   // Do the necessary UI logic and send the result back
                   msg.Execute(true);
               }
      }

Пожалуйста, дайте мне знать, если это поможет.

0 голосов
/ 17 ноября 2012

У вас есть несколько вариантов, но, вероятно, лучшим ответом будет тот, который лучше всего подходит для всего остального дизайна вашего приложения. Один вариант, который не был вызван, заключается в том, что ваш child-ViewModel может иметь ссылку на parent-ViewModel (это могло быть предоставлено в исходном сообщении, открывшем дочерний элемент), и child-ViewModel может запросить parent-ViewModel любой вопрос, который ему нужен, через метод или свойство.

Пример запроса от child-ViewModel:

bool canSave = _parentViewModel.CanSave(childInfo)

Если вы хотите использовать этот дочерний элемент от нескольких типов родителей, вы можете создать интерфейс, который гарантирует, что разработчики имеют метод CanSave, который всегда можно вызывать из дочернего элемента.

interface ISaveQuerable
{
    bool CanSave(YourType childInfo);
}

Это всего лишь один из вариантов, и он будет работать независимо от того, используете ли вы обмен сообщениями или прямую ViewModel для создания и связи ViewModel. Основная идея состоит в том, что вместо создания обратных вызовов, если вы знаете, что родитель должен всегда реализовывать некоторую функциональность, то предоставление этого факта в сообщении приводит в исполнение это как часть контракта сообщения. Те, кто создает дочерний элемент с помощью сообщения, должны будут предоставить что-то, что реализует интерфейс, и дочерний элемент будет гарантированно иметь что-то доступное для вызова строго типизированным и проверенным временем компиляции способом.

0 голосов
/ 18 мая 2011

Трудно сказать, но из того, что вы описали, похоже, что у вас есть некоторые правила в родительской модели представления, которые принадлежат этой модели. Если вы вставили эти правила в модель, то и родительская, и дочерняя виртуальные машины могут использовать их.

Однако, если это не так, у вас всегда могут быть какие-то отношения публикации / подписки, которые родитель и дочерний элемент регистрируют и используют эти события для связи.

Я бы склонялся к модельному подходу.

...