2014-12-23 3 views
2

Я разрабатываю приложение с Xamarin и MVVMCross, и у меня возникают проблемы с созданием констант NSLayoutConstraints.Как правильно привязать константу NSLayoutConstraint?

У меня есть представление с Subview, которое должно «исчезнуть», если в определенном списке <> нет элементов, а содержимое ниже должно двигаться вверх, а не оставлять его пустым.

Для этого я добавил 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).

Код не дает ошибки выполнения и проходит через Конвертер, но когда я запускаю приложение, представление все еще существует, пустое.

С другой стороны, если я запускаю следующую строку кода внутри ViewWillLayoutSubviews, она отлично работает, но не привязана.

ConstraintHeightPictures.Constant = ViewModel.Activity.ImageList.Count > 0 ? Constants.HeightActivityImages : 0.0f; 

Любые идеи?

Большое спасибо!

Jordi

ответ

3

Я думаю, что проблема в том, что IOS нуждается в вас, чтобы позвонить LayoutIfNeeded (или аналогичный), после установки постоянной.

например. для того, чтобы оживить постоянное изменение ограничений см 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); 

Я думаю, что это должно сработать ... (и если вы не хотите анимации, тогда это должно быть легко удалить)

Альтернативно ... y ou также может создать пользовательскую привязку, которая будет знать, как это сделать (хотя это может быть немного затруднено тем фактом, что для этого потребуется доступ как к дочернему виду, так и к ограничению).

+0

Спасибо Stuart! Оно работает! :) –

+0

:) Если есть какие-либо обновления, необходимые для ответа, пожалуйста, отредактируйте их и улучшите их :) – Stuart

Смежные вопросы