2016-05-15 2 views
0

Если вы разработчик Xamarin.Forms, у вас, скорее всего, были проблемы со встроенным ListView. Было бы проще с простым ретранслятором для привязки ItemsSource с использованием DataTemplate? Это то, о чем я думал.Как создать простой элемент Xamarin.Forms View

В SL/WPF есть ItemsControl, который работает именно так - без дизайна, без выбора, просто повторяющихся элементов.

Теперь есть один в XLabs, но если вы не хотите, чтобы все из них были пакетами, вот более простое решение, основанное на this article от QiMata.

Инструменты:

  • Visual Studio 2015 @ Win 10 (или использовать Xamarin студии/на OS X)
  • Xamarin 4 конюшне (VS плагин)
  • Xamarin.Forms 2.1.0.6529
+1

Возникает вопрос? –

ответ

6

Создайте новый класс в проекте Xamarin.Forms PCL. Я назвал шахту HliItemsView (так как «Вид» - это термин «Элементы управления» в XF и Hli - это мой бренд).

Вставьте этот код и измените при необходимости.

Я основываю свое мнение на ScrollView, так как это список. Таким образом, элементы будут автоматически прокручиваться точно так же, как ListView.

using System; 
using System.Collections; 

using Xamarin.Forms; 

namespace HLI.Forms.Controls 
{ 
    public class HliItemsView : ScrollView 
    { 
     public static readonly BindableProperty ItemTemplateProperty = BindableProperty.Create(
      "ItemTemplate", 
      typeof(DataTemplate), 
      typeof(HliItemsView), 
      null, 
      propertyChanged: (bindable, value, newValue) => Populate(bindable)); 

     public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(
      "ItemsSource", 
      typeof(IEnumerable), 
      typeof(HliItemsView), 
      null, 
      BindingMode.OneWay, 
      propertyChanged: (bindable, value, newValue) => Populate(bindable)); 

     public IEnumerable ItemsSource 
     { 
      get 
      { 
       return (IEnumerable)this.GetValue(ItemsSourceProperty); 
      } 

      set 
      { 
       this.SetValue(ItemsSourceProperty, value); 
      } 
     } 

     public DataTemplate ItemTemplate 
     { 
      get 
      { 
       return (DataTemplate)this.GetValue(ItemTemplateProperty); 
      } 

      set 
      { 
       this.SetValue(ItemTemplateProperty, value); 
      } 
     } 

     private static void Populate(BindableObject bindable) 
     { 
      var repeater = (HliItemsView)bindable; 

      // Clean 
      repeater.Content = null; 

      // Only populate once both properties are recieved 
      if (repeater.ItemsSource == null || repeater.ItemTemplate == null) 
      { 
       return; 
      } 

      // Create a stack to populate with items 
      var list = new StackLayout(); 

      foreach (var viewModel in repeater.ItemsSource) 
      { 
       var content = repeater.ItemTemplate.CreateContent(); 
       if (!(content is View) && !(content is ViewCell)) 
       { 
        throw new Exception($"Invalid visual object {nameof(content)}"); 
       } 

       var view = content is View ? content as View : ((ViewCell)content).View; 
       view.BindingContext = viewModel; 

       list.Children.Add(view); 
      } 

      // Set stack as conent to this ScrollView 
      repeater.Content = list; 
     } 
    } 
} 
Смежные вопросы