我正在使用Xamarin和MvvmCross来创建一个iPad应用程序。在这个应用程序中,我想支持旋转,以便在旋转事件发生时自动调整布局。
我知道GetSupportedInterfaceOrientations和ShouldAutorotate方法,我试图覆盖它以捕获事件并重置我使用的ViewModels中的可观察属性。此外,视图已经设置了两次:
1)设置要绑定到屏幕属性的控件(即标签):
var theLabel = new UILabel(new RectangleF(0, 0, UIScreen.MainScreen.Bounds.Width, 30));
2)通过可观察的ViewModel属性设置要绑定到屏幕属性的控件(即标签),这些属性在View的GetSupportedInterfaceOrientations和ShouldAutorotate方法中设置。但是,这里没有绑定值,只需设置:
var theLabel = new UILabel(new RectangleF(0, 0, ViewModel.TheLabelWidth, 30));
我试图通过delaybind中的bindingset相应地设置宽度,但是width属性不能像我期望的那样在.For(lambda表达式)中设置。
无论原因是什么,似乎界面没有重绘。 ViewModel中的值确实已设置。有人对此提出任何建议吗?
提前致谢。
答案 0 :(得分:0)
为什么要在ViewModel中处理与UI相关的任务?您应该使用MVVM模式的主要原因是将逻辑与UI分开。 Logic转到ViewModel,UI转到View。所以你不应该对ViewModel进行任何UI测量和旋转处理,因为它不是逻辑的一部分,不能在其他平台上重复使用。
顺便说一句,如果您想自动处理旋转,您应该使用约束或使用允许您创建自动布局的工具(即http://www.toptensoftware.com/xibfree/)。
答案 1 :(得分:0)
我建议您阅读有关MVVM模式的更多信息。
视图模型中不应存在任何与UI相关的值\属性!
这意味着,没有屏幕坐标来定位控件,没有颜色值,没有字体名称,绝对没有任何与UI相关的内容!
视图模型应始终与视图和平台无关。
您应该在特定于平台的视图代码中处理所有与视图相关的内容(例如,在iOS,UIViewController上)
如果您需要具有特定的UI相关值(控制位置,可见性等),具体取决于视图模型中的值,那么您应该使用值转换器(在此处阅读它们) https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters)
其次,我不清楚您要使用所发布的代码实现的目标,但请确保您正确使用iOS布局系统。使用 AutoLayout 来定位和调整大小控件将使您的UI看起来和任何屏幕尺寸,任何iPhone和任何iPad上的工作。
答案 2 :(得分:0)
您的视图模型需要使用信使(如Mvx Messenger)向您的视图发送消息