gpt4 book ai didi

c# - 从 MVVMCross 上的 ViewModel 执行 UI 代码

转载 作者:太空狗 更新时间:2023-10-29 22:14:09 25 4
gpt4 key购买 nike

我刚刚开始使用 MvvmCross,但我没有找到任何关于如何从 ViewModel 执行 UI 代码的信息。

在 Caliburn 上有协程,因此我可以访问 View 并将 ui 代码与 viewmodel 代码分开。在我的第一个案例中,我需要从 ViewModel 中的命令打开一个对话框,正确的方法是什么?

现在我正在开发 WinRT 应用。

谢谢

最佳答案

MvvmCross 对此没有任何硬性规定。

通常,当我需要这样做时,我会使用 Messenger 插件。

此答案假定您使用的是最新的 Alpha v3 代码。对于较旧的 vNext 代码,您必须进行一些翻译 - 请参阅下面的注释。

要使用这种方法:

我从 Core 和 UI 项目中引用了 Cirrious.MvvmCross.Plugins.Messenger.dll

然后我在 Setup.cs 的某处添加一行(例如在 InitializeLastChance 中):

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

然后在 Core 项目中添加一条消息:

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

在 ViewModel 中,我可以通过构造函数注入(inject)或通过以下方式获取 Messenger:

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

我可以通过调用发送消息:

messenger.Publish(new InputIsNeededMessage(this));

在 View 中,我可以再次使用 Messenger 和订阅消息:

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
}

上面的顺序是我通常为“正确的代码”所做的

开始使用 Messenger/EventAggregator 可能会让人感觉不舒服——我确实花了一段时间来适应它——但在我习惯了它之后,我现在到处都使用它——发布/订阅消息解耦是非常灵活的测试和 future 代码维护(IMO)

作为上述方法的替代方案,我有时会走捷径:

  • 有时我从 ViewModel 触发正常的 C# 事件并让 View 响应这些事件
  • 有时我有特殊的标记属性并从中触发 UI 代码

很抱歉使用 v3 语法 - 但转换即将到来,这就是我现在编码的内容......

要切换回 vNext 我认为您可能需要:

  • 使用 IMessenger 代替 IMvxMessenger
  • 使用 BaseMessage 而不是 MvxMessage
  • 使用 Subscribe 而不是 SubscribeOnMainThread - 但是您需要自己将消息编码到 UI 线程。

关于c# - 从 MVVMCross 上的 ViewModel 执行 UI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15590776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com