Передать объект из ВМ в ВМ в представлении - PullRequest
0 голосов
/ 16 декабря 2011

Я потратил много времени на изучение возможностей обмена объектами между виртуальными машинами и пришел к успешному решению, но это не совсем элегантно:

Допустим, я хочу отправить из VM1 объект _testObject класса TestClass, который отображается в V1, причем DataContext, очевидно, является VM1 в VM2, и отобразить его в представлении V2.

public class VM1: ViewModelBase
{
   ...

   public VM1 ()
   {
      ...

      Messenger.Default.Register <bool> (this, "isLoaded" t => Messenger.Default.Send<TestClass> (_testObject "myObject"));
    }

    ...
}

    public partial class V2: PhoneApplicationPage
    {
       public V2 ()
       {
          InitializeComponent ();
       }

       protected override void OnNavigatedTo (System.Windows.Navigation.NavigationEventArgs e)
       {
          Messenger.Default.Register <TestClass> (this.DataContext "myObject", mo => (this.DataContext and VM2). PropertyInVM2 = mo);
          Messenger.Default.Send <bool> (true, "isLoaded");
          base.OnNavigatedTo (e);
       }

       protected override void OnNavigatedFrom (System.Windows.Navigation.NavigationEventArgs e)
       {
          Messenger.Default.Unregister <TestClass> (this.DataContext "myObject");
          base.OnNavigatedFrom (e);
       }
    }

Таким образом, если приложение переходит на V2, оно ждет, пока страница не будет создана, затем отправляет сообщение «isLoaded», захваченное в VM1, а затем VM1 отправляет сообщение с объектами, которые вам нужны, в VM2.

Нет, мне не нравится это, и я не хочу в коде bihnd. Кто-нибудь может посоветовать мне более элегантный способ?

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

[caveat: Поскольку вы пометили этот вопрос MVVM-Light и упомянули Messenger в своем посте, я предполагаю, что вы используете инфраструктуру MVVM Light.]

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

  • В первом случае VM2 регистрируется для прослушивания сообщения, а VM1 отправляет его.Поскольку VML инстанцировал обе виртуальные машины, обе они живы, когда сообщение отправлено, и все работает как положено.
  • Во втором случае VML всегда активен и может при необходимости выполнять отложенную загрузку VM2, когда VM1 отправляет сообщение.

В обоих случаях V1 и V2 вообще не участвуют в передаче сообщений, и это хорошо.

Третий вариант, в зависимости от сложности вашего приложения / потребностей / архитектуры /и т.д., чтобы разделить VM1 между V1 и V2.Тогда вам не нужно никуда передавать какие-либо данные :) Этот подход хорошо работает для небольших приложений, но если ваше приложение сложное, вы легко можете столкнуться с проблемами.

Любой подход имеет свои плюсы и минусы, но этоКак я понимаю, вы можете сделать это с помощью MVVM Light.FWIW - EventAggregator является частью Prism, а не частью MVVM Light, поэтому использование EventAggregator означает получение дополнительных зависимостей из среды Prism, которые вы можете или не хотите делать.Поскольку EventAggregator и Messenger выполняют сходные функции, вы можете объединить их вместе, но я этого не пробовал.

0 голосов
/ 16 декабря 2011

Я бы предложил использовать EventAggregator и подписать / опубликовать через ваш интерфейс Сообщение от ВМ на другую ВМ.

Более элегантно использовать IoC и разрешать ему взаимодействие с VMS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...