2017-01-20 6 views
2

Следующее приложение XF (код ниже) создает простой ListView с 2 настраиваемыми ячейками. Нажатие на ячейку использует свойство IsVisible для отображения второй метки.Xamarin Forms - iOS динамический размер ViewCell в ListView

В Android это отлично работает, так как размер ViewCell изменяется в соответствии с отображаемым в настоящее время содержимым. Когда элемент Detail становится видимым, ViewCell расширяется, чтобы показать детали.

На iOS это не работает.

Вот как при первом запуске появляется приложение ...

enter image description here

При нажатии на первую ViewCell, то IsVisible свойство споткнулся и Detail пункт показывает. Однако ViewCell остается такой же высоты, заставляя его переполнения, как показано ниже ...

enter image description here

Как это может быть достигнуто на стороне IOS?

Вот код ...

XAML

<ContentPage.Content> 
    <ListView x:Name="___list" Margin="50" HasUnevenRows="True"> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      <StackLayout> 
       <StackLayout.GestureRecognizers> 
       <TapGestureRecognizer Command="{Binding CellTap}" /> 
       </StackLayout.GestureRecognizers> 
       <Label Text="{Binding Title}" /> 
       <Label Text="{Binding Detail}" FontSize="30" IsVisible="{Binding ShowDetails}" /> 
      </StackLayout> 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    </ContentPage.Content> 

C#

public partial class MainPage : ContentPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     ___list.ItemsSource = new List<Element>() { 
       new Element() { 
        Title="First Element", 
        Detail = "First Element Details" 
       }, 
       new Element() { 
        Title="Second Element", 
        Detail = "Second Element Details" 
       } 
      }; 
    } 
} 
public class Element : INotifyPropertyChanged 
{ 
    public Element() 
    { 
     CellTap = new Command(() => 
     { 
      ShowDetails = !ShowDetails; 
     }); 
    } 

    public ICommand CellTap { get; private set; } 

    private string _title; 
    public string Title 
    { 
     get { return _title; } 
     set { if (_title != value) { _title = value; OnPropertyChanged("Title"); } } 
    } 
    private string _detail; 
    public string Detail 
    { 
     get { return _detail; } 
     set { if (_detail != value) { _detail = value; OnPropertyChanged("Detail"); } } 
    } 
    private bool _showDetails; 
    public bool ShowDetails 
    { 
     get { return _showDetails; } 
     set { if (_showDetails != value) { _showDetails = value; OnPropertyChanged("ShowDetails"); } } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

ответ

4

ViewCell не может автоматически узнать, как высоко он должен быть. Вы должны будете поддержать его, установив его Height или заставив его обновить. К сожалению, Height не поддается связыванию.

Вариант 1: используйте это, если у вас разные высоты в строке, и список не может определить правильную высоту.

class CustomViewCell : ViewCell 
{ 
    protected override void OnBindingContextChanged() 
    { 
    base.OnBindingContextChanged(); 
    // Do some calculation in here to get the height you need. 
    // Here we are using an example that bases the size on the result of ToString() 
    string text = BindingContext.ToString(); 
    Height = 10 + ((int)(text[0]) - 65); 
    } 
} 

Вариант 2: высота изменение динамически (возможно, что вы хотите)

void SomeEventHandler(object sender, EventArgs args) 
{ 
    // Let's assume an image was tapped... 
    var image = sender as Image; 
    // ...and the image is in a cell. 
    var viewCell = image.Parent.Parent as ViewCell; 

    // You would FIRST change the height of the content (in this case the image) 
    if (image.HeightRequest < 250) 
    { 
     image.HeightRequest = image.Height + 100; 
     // And THEN tell the cell to update (Note: you should not be required 
     // to subclass the cell) 
     viewCell.ForceUpdateSize(); 
    } 
} 

Убедитесь, что HasUnevenRows = true, в противном случае принуждая обновление не будет иметь эффект.

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