2013-03-23 3 views
4

Я только начал использовать MvvmCross, но я не нашел информацию о том, как я могу выполнить код пользовательского интерфейса из ViewModel.Выполнение кода пользовательского интерфейса из ViewModel на MVVMCross

На Caliburn есть сопрограмма, поэтому я могу получить доступ к виду и сохранить код ui отдельно от кода viewmodel. в моем первом случае мне нужно открыть набор из команды внутри ViewModel, что это правильный способ?

Сейчас я разрабатываю приложение WinRT.

Благодаря

+0

Как и для ответа на то, что вы можете сделать сегодня, я также добавил https://github.com/slodge/MvvmCross/issues/197 - если у вас есть какие-либо запросы, пожалуйста, добавьте их в - всегда рады рассмотреть, есть ли что-нибудь, что мы можем добавить на всех платформах :) – Stuart

ответ

13

Там нет никакого жесткого/быстрое правило на это в MvvmCross.

Как правило, когда мне нужно это сделать, я использую плагин Messenger.

Этот ответ предполагает, что вы используете последний код Alpha v3. Для более старого кода vNext вам нужно будет сделать перевод - см. Примечания ниже.

Чтобы использовать этот подход:

я ссылаться Cirrious.MvvmCross.Plugins.Messenger.dll из основных и проектов пользовательского интерфейса.

Затем я добавляю строку где-то в Setup.cs (например,в InitializeLastChance) по адресу:

Cirrious.MvvmCross.Plugins.Messenger.PluginLoader.Instance.EnsureLoaded(); 

Тогда в проекте ядра добавить сообщение:

public class InputIsNeededMessage : MvxMessage 
{ 
    public InputIsNeededMessage(object sender) : base(sender) {} 
} 

В ViewModel я могу получить Посланник инъекции конструктора или:

var messenger = Mvx.Resolve<IMvxMessenger>(); 

и я могу отправлять сообщения по телефону:

messenger.Publish(new InputIsNeededMessage(this)); 

В представлении я могу снова получить посланную и подписаться на сообщения с помощью:

var messenger = Mvx.Resolve<IMvxMessenger>(); 
_token = messenger.SubscribeOnMainThread<InputIsNeededMessage>(OnInputIsNeeded); 

где _tokenдолжен быть переменным-член - если нет, то подписка не будет сохраняться - подписка сам по себе слабому по умолчанию (так что вы никогда не должны отказаться от подписки)

и где OnInputIsNeeded что-то вроде:

private void OnInputIsNeeded(InputIsNeededMessage message) 
{ 
    if (message.Sender != ViewModel) 
     return; 

    // do stuff here - you are already on the UI thread 
} 

выше последовательность, что я обычно делаю для «правильного кода»

Чтобы начать с помощью курьера/EventAggregator может чувствовать себя некомфортно - это, конечно, мне потребовалось некоторое время, чтобы привыкнуть к нему, - но после того, как я сделал привыкаем к этому, то я теперь использовать его везде - паб/суб сообщение расцепления является очень гибким для тестирования и последующего техническое обслуживание коды (ИМО)

в качестве альтернативы этого подхода выше я иногда принимаю ярлыки:

  • некоторые раз я огнь нормальное C# событие из ViewModel и иметь Посмотреть ответ на эти
  • иногда у меня есть особые свойства маркеров и огнь кода UI из них

К сожалению для использования v3 синтаксиса - но переход приходит, и это то, что я сейчас кодирования в ...

чтобы переключиться обратно на vNext я думаю, что вы, возможно, потребуется:

  • использование IMessenger вместо IMvxMessenger
  • использования BaseMessage вместо использования MvxMessage
  • Subscribe вместо SubscribeOnMainThread - но тогда вы должны Маршаллу сообщение на UI нить самостоятельно.
+0

Вау, спасибо за подробное объяснение, я проверю эту ветку завтра.Я уже привык использовать EventAggregator на Caliburn для других целей, поэтому я думаю, что буду дома :) Извините, я не заметил этого плагина. Спасибо за вашу помощь – nukedbit

+0

привет, я также использую тот же шаблон обмена сообщениями в приложении iOS, но проблема в том, что сообщения отображаются много раз. это происходит, когда вы двигаетесь вперед и назад. ех. У меня есть вид входа в систему и вид обратной связи, который появляется после входа в систему. поэтому, как только я вхожу в систему и перехожу к просмотру обратной связи, и заполните поле этой страницы, он работает нормально. но если я теперь вернусь к логину и снова вернусь к просмотру обратной связи и заполняю поля, а когда нажимаю кнопку «Готово», я получаю много сообщений. можете ли вы направить меня, каково будет разрешение этой ситуации? – SoftSan

+0

Могу ли я использовать его для передачи сообщений из вида в viewmodel? –

 Смежные вопросы

  • Нет связанных вопросов^_^