我正在使用Xamarin和MVVMCross开发应用程序,而且我在创建绑定NSLayoutConstraints常量方面遇到了问题。
我有一个Subview的视图应该" disapear"如果某个List<>没有元素,下面的内容应该向上移动,而不是让它的空间为空。
为此,我在此视图中添加了一个NSLayoutConstraint,以便能够以编程方式修改它的高度,并将其与以下代码行绑定:
var set = this.CreateBindingSet<ActivityView, ActivityViewModel> ();
set.Bind (ConstraintHeightPictures).To (vm => vm.Activity.ImageList.Count).For (cons => cons.Constant).WithConversion ("CountToConstraintHeight", Constants.HeightActivityImages);
set.Apply ();
CountToConstraintHeightConverter非常简单,它只是检查值是否等于0以返回0或其他默认高度值(Constants.HeightActivityImages)。
代码没有给出执行错误并通过转换器,但是当我运行应用程序时,View仍然存在,为空。
另一方面,如果我在ViewWillLayoutSubviews
中运行以下代码行,它可以很好地工作,但它没有绑定。
ConstraintHeightPictures.Constant = ViewModel.Activity.ImageList.Count > 0 ? Constants.HeightActivityImages : 0.0f;
有什么想法吗?
非常感谢提前!
霍尔迪阿
答案 0 :(得分:3)
我认为问题是iOS需要您在设置常量后调用LayoutIfNeeded
(或类似)。
e.g。要为约束常量更改设置动画,请参阅Are NSLayoutConstraints animatable?
对于绑定,您可以使用View
上的属性来执行此操作,例如:
public float PicHeight
{
get { return ConstraintHeightPictures.Constant; }
set {
ConstraintHeightPictures.Constant = value;
_pictureView.SetNeedsUpdateConstraints();
UIView.Animate(0.25f, () => {
_pictureView.LayoutIfNeeded();
}
}
}
然后可以绑定为:
set.Bind (this).To (vm => vm.Activity.ImageList.Count).For (v => v.PicHeight).WithConversion ("CountToConstraintHeight", Constants.HeightActivityImages);
我认为这应该有用......(如果你不想要动画,那么应该很容易将其去掉)
或者......您也可以构建一个知道如何进行此更改的自定义绑定(尽管由于它需要访问子视图和约束这一事实可能会有点复杂)