2015-03-12 5 views
2

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

App содержит ListView с ItemsSource набора на фиктивного список всех символов от А до Z. ItemTemplate создается с пользовательской ItemCell, определенной ниже.

public class App : Application 
{ 
    public App() 
    { 
     MainPage = new ContentPage { 
      Content = new ListView { 
       ItemsSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(), 
       ItemTemplate = new DataTemplate(typeof(ItemCell)), 
      }, 
     }; 
    } 
} 

The ItemCell содержит Label привязанный к элементу списка.

public class ItemCell: ViewCell 
{ 
    public ItemCell() 
    { 
     View = new Label(); 
     View.SetBinding(Label.TextProperty, "."); 
    } 
} 

КСН в Label оказывается следующим FixedLabelRenderer. Он устанавливает нативное управление, представленное UILabel, содержащее ElementText.

public class FixedLabelRenderer : ViewRenderer<Label, UILabel> 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
    { 
     base.OnElementChanged(e); 

     SetNativeControl(new UILabel(RectangleF.Empty) { Text = Element.Text }); 
    } 
} 

Теперь проблема заключается в том, что, по-видимому, при повторном использовании ячейки, контроль не удаляется, а только новое создается. Поэтому я получаю наложения, показанные на скриншотах ниже.

(Слева: перед прокруткой, Справа: после прокрутки)

Интересно этот вопрос не происходит с Xamarin.Forms 1.2.3 или 1.3.1, но с 1.3.5 и 1.4. 0.

ответ

-1

О, я нашел решение on the Xamarin Forum:

protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
{ 
    base.OnElementChanged(e); 

    if (Control == null) 
     SetNativeControl(new UILabel()); 

    if (e.NewElement != null) 
     Control.Text = e.NewElement.Text; 
} 

Поэтому в основном вы должны убедиться, чтобы создать только один UILabel и использовать его впоследствии.

+0

Не могли бы вы объяснить более подробно? –