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