【问题标题】:How to pass a View to my ViewModel so an I*Service can use that View to do something如何将视图传递给我的 ViewModel,以便 I*Service 可以使用该视图做某事
【发布时间】:2014-09-18 12:52:23
【问题描述】:

https://github.com/brianchance/MvvmCross-UserInteraction 是一个非常不错的插件,用于显示跨平台警报!

但是对于这个问题,我们是否可以假设它不能使用 UIAlertView(或其他平台上的其他顶级 MessageBox 类型调用)但需要在屏幕的给定子部分中显示消息(即在 iPhone 上你需要为插件提供一个 UIView,它将用于在其中显示消息)。

那么,您将如何设置它以便 ViewModel 知道将哪个 View 用作其显示容器?

作为一个具体的例子,如果我想要一个错误服务,那么 -

public interface IErrorPFService
{
    void Show();
    void Hide();
    void SetErrors(List<Error> errors);
}

我为它创建了一个特定于平台的实现。

如果我将它注入到我的 ViewModel 中以便它可以控制错误显示/隐藏/设置我如何告诉它我希望我的错误显示在其中的 UIView(或等效项)?

我能否将 IErrorPFService 字段公开为公共属性并执行 -

MyViewModel.ErrorPFService = new ErrorPFService(View);

在我的 ViewDidLoad ...

或者这与 Mvvm 实践耦合不正确?

【问题讨论】:

    标签: mvvm mvvmcross


    【解决方案1】:

    我希望 ViewModel自己订阅 ErrorService。

    当接收到消息时,它会将其暴露在一个集合中(?),并且视图将绑定到该集合。

    这样,视图对于服务来说是未知的,并且 ViewModel 有机会与您的解决方案相反地影响视图。

    【讨论】:

    • 感谢 Erno 的评论,正在考虑上述后续步骤。
    【解决方案2】:

    如果您可以为您所描述的场景举例说明,将会有所帮助。

    有时,您希望在视觉上显示某些内容的方式可能不是最好的方式,因此如果可能的话,您可能会找到一种不同且更简单的方式,这样您就不必为所描述的内容寻找解决方案.

    通常,我总是尽我所能避免必须从视图模型到视图实际传递“视图”或它的抽象的想法。此外,跨平台方面,UI 交互方面的工作方式可能大不相同。您可能会发现自己处于复杂的境地,只是因为 UI 的工作方式与您的预期不同。

    但是让我们尝试寻找另一个视角:

    在任何给定点,视图都知道它正在显示什么数据\特性。因此,当您从视图模型调用用户交互操作(通过服务、属性更改、事件等)时,视图应该“期待”它。

    例如,特定于平台的用户交互实现能够获取当前显示的顶视图并以特定于平台的方式或基于关系进行交互。在您的示例中,消息框可以显示在顶级视图的特定子视图中。

    在高级场景中,我想您可以尝试为此创建一个跨平台方法,但您应该尝试平衡您想要为此创建的所有抽象。考虑将其作为计划... Z. 如果可能的话。同样,举个例子可能会有所帮助。

    【讨论】:

    • 谢谢,我可以通过在 ViewModel 上放置一些属性来了解如何做到这一点,例如 ErrorsList、ShowErrors、HideErrors,然后在 VM 中设置它们并在 UI 中对它们做出反应(然后我可以去如果大多数屏幕都使用它们,则将它们放入 BaseViewModel ...),但我只是想了解一种明确表示 VM 支持显示错误信息的方法(因此是 IErrorPFService),然后我想确保 View然后能够根据平台处理这些错误。在解决视图问题后,感觉就像一个插件将成为最终结果,如 UserInteraction!
    • 我会去寻找一些代码/澄清问题,因为它看起来不像是一个明显的回应..它与在 MVVM 中显示对话框位于同一区域,并且有很多关于此的文献和如何解耦。
    • 您提供的示例名称(例如“ShowsErrors”“HideError”)对于视图模型对我来说并不合适。我想再次询问您是否有示例说明您正在尝试做的事情。
    • 我了解您来自哪里,会查看您描述的 KISS 方法并返回更多信息。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多