使用mvvmcross中的数据绑定管理数据相关的屏幕布局(在iOS上)

时间:2014-08-23 18:29:18

标签: ios data-binding xamarin.ios xamarin mvvmcross

在大多数情况下,屏幕上的数据布局实际上并不依赖于数据本身,而且通过绑定到isHidden,可以直接管理mvvmcross等可见性设置等简单设置。对于更高级的屏幕相关方面,可以对视图进行子类化,并在setter中进行视图调整。这方面的例子是N = 33 - “在iOS,Android和Windows中动画Mvvm文本 - N + 1天的Mvvmcross”。具体来说是here is what I'm talking about

但是,如果我有这样的情况,我希望定位与屏幕上的数据绑定的元素取决于数据本身,并使事情变得更糟 - 如果定位规则影响其他元素屏幕也是?

这方面的一个例子是:屏幕上最多5个按钮,相隔10个像素。如果某些源数据为空,则应排除每个按钮 - 因此屏幕上的其余按钮布局必须根据数据而改变。无论有多少按钮被跳过,我们都希望按钮相隔10个像素。

对于iOS autolayout可以容纳这一点。但是,假设我现在没有使用autolayout,即使我可能会使用它,在代码中手动执行布局的其他选择是什么呢?在某些情况下,布局规则可能是非线性的,或者太复杂,无法自动布局以便能够为我配置视图。

我所做的(目前)是对相关视图元素进行子类化,并在setter中,在父视图上运行relayout方法,该方法应用我需要的所有子规则元素。关于这种方法的蹩脚部分是我为每个这样的元素运行relayout一次,当我真的只需要运行一次代码时(至少对于初始值)。此后,如果以这种方式绑定任何数据更改,则重新布局整个视图是合适的,但不是在我们首次初始化屏幕并且所有值立即更改时。

所以至少,抑制relayout次调用的初始化是很好的(在初始数据滚动期间影响其他元素的每个屏幕元素都有一个)。

有没有人对此有过想法?

1 个答案:

答案 0 :(得分:0)

我会使用Messenger插件将ViewModel的重播请求传递给View。

初始化后发布RelayoutMessage。然后在数据发生变化时再次发布。

通过使用消息,您仍然可以将View和ViewModel分开。