如何将View传递给我的ViewModel,以便I * Service可以使用该View执行某些操作

时间:2014-09-18 12:52:23

标签: mvvm mvvmcross

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 Practice的错误耦合?

2 个答案:

答案 0 :(得分:2)

我希望ViewModel将本身订阅到ErrorService。

当收到消息时,它会在集合(?)中公开它,并且View将绑定到该集合。

这样,服务不知道View,ViewModel有可能影响View,与您的解决方案相反。

答案 1 :(得分:2)

如果你能举例说明你所描述的情景,那将会有所帮助。

有时候,你在视觉上想要展示某些东西的方式可能不是最好的方式,所以如果你有可能,你可能会找到一种不同且更简单的方法,这使你不必找到关于你所描述内容的解决方案。

一般来说,我总是尽力避免从视图模型到视图实际传递“视图”或抽象的想法。此外,跨平台方面,在UI交互方面,事情可能会有很大不同。当事情变得复杂时,你会发现自己只是因为UI的工作方式不同于你的预期。

但我们试着找另一个观点:

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

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

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