2016-03-09 4 views
0

Есть ли что-нибудь подобное в Xamarin? Что-то, где есть список родительских элементов, и когда один из них щелкнул по списку дочерних элементов, появляется под ним.Xamarin ExpandableListView

Ex.

Parent 
-Child 
-Child 
Parent 
Parent 

Я попытался поставить обычай: listview внутри обычаев: listview. План состоял в том, чтобы изменить видимость мыши, но я получаю следующее сообщение об ошибке:

System.NotSupportedException: Не удалось активировать экземпляр типа Xamarin.Forms.Platform.Android.ListViewAdapter из родной ручки 0xbf835bfc (key_handle 0x26566218).

+2

вы используете Android, IOS, или Xamarin формы? Вы можете сделать это на Android, но не в iOS или Forms без написания пользовательских элементов управления. – Jason

+0

@ Джейсон Я использую Xamarin Forms. – Scko

+1

Вы не можете сделать это изначально в Формах, потому что в iOS нет встроенного элемента управления для его отображения. Вы можете либо написать пользовательский элемент управления, либо написать собственный рендерер. В этом вопросе много дискуссий; или см. это: https://github.com/danvanderboom/Xamarin-Forms-TreeView – Jason

ответ

0

Вы можете сделать это изначально в форматах Xamarin с помощью группировки заголовков в ListView. Сначала нужно создать структуру группировки:

public class Grouping<TK, T> : ObservableCollection<T> 
{ 
    public TK Key { get; private set; } 

    public Grouping(TK key, IEnumerable<T> items) 
    { 
     Key = key; 
     foreach (var item in items) 
      Items.Add(item); 
    } 
} 

Создать ViewModel, чтобы обернуть родительскую модель с дополнительным Логическим свойством, чтобы показать, что родитель был выбран/должен показывать свои дочерние элементы:

public class SelectParentViewModel 
{ 
    public Parent Parent { get; set; } 
    public bool Selected { get; set; } 
} 

В вашем ViewModel страницы создать следующее свойство для привязки к вашему ListView

public ObservableCollection<Grouping<SelectParentViewModel, Child>> Parents { get; set; } 

Initlialise родителям содержать новую группу для каждого из ваших родителей с новым пустым литием st для элементов Child.

Добавить команду, которая принимает параметр Grouping<SelectCategoryViewModel, Item> в качестве параметра. Команда сначала переворачивает свойство «Выделение» ключа группировки. Затем он проверяет новое значение выбранного свойства:

  • Если это правда -> заполнит Дочерние элементы
  • Если ложь -> Очищает элементы Детские

в вашей ListView

  • Привязать свойство ItemsSource к свойству «Категории» и установить значение IsGroupingEnabled в «True»
  • Установите ListView.GroupHeaderTemplate в ViewCell для отображения каждого родителя
  • Добавить насыпную жест распознаватель к внешней точке зрения в ViewCell, которая вызывает команду либо ясно или заполнить дочерние элементы для родительского
  • Установите ListView.ItemTemplate для отображения каждого дочернего элемента

Этот блог описывает группирование в ListViews: http://motzcod.es/post/94643411707/enhancing-xamarinforms-listview-with-grouping

пример форм проекта демонстрирует это доступно на моем GitHub https://github.com/umarmohammed/XFExpandableListView

0

У меня была аналогичная проблема, и я использовал Custom Control, чтобы заставить его работать.

При создании Content View 'ExpandableView' с Xaml как:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyProject.CustomControls.ExpandableView"> 
    <StackLayout x:Name="Layout" Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
     <StackLayout x:Name="SummaryRegion">    
     <StackLayout x:Name="DetailsRegion"/> 
    </StackLayout> 
</ContentView> 

и проволоки вверх класс .cs следующим образом:

public partial class ExpandableView: ContentView 
    { 

     private TapGestureRecognizer _tapRecogniser; 
     private StackLayout _summary; 
     private StackLayout _details; 

     public ExpandableView() 
     { 
      InitializeComponent(); 
      InitializeGuestureRecognizer(); 
      SubscribeToGuestureHandler();  
     } 

     private void InitializeGuestureRecognizer() 
     { 
      _tapRecogniser= new TapGestureRecognizer(); 
      SummaryRegion.GestureRecognizers.Add(_tapRecogniser); 
     } 

     private void SubscribeToGuestureHandler() 
     { 
      _tapRecogniser.Tapped += TapRecogniser_Tapped; 
     } 

     public virtual StackLayout Summary 
     { 
      get { return _summary; } 
      set 
      { 
       _summary = value;  
       SummaryRegion.Children.Add(_summary); 
       OnPropertyChanged(); 
      } 
     } 

     public virtual StackLayout Details 
     { 
      get { return _details; } 
      set 
      { 
       _details = value; 
       DetailsRegion.Children.Add(_details); 
       OnPropertyChanged(); 
      } 
     } 

     private void TapRecogniser_Tapped(object sender, EventArgs e) 
    { 
     if (DetailsRegion.IsVisible) 
     { 
      DetailsRegion.IsVisible = false; 
     } 
     else 
     { 
      DetailsRegion.IsVisible = true; 
     } 
    } 

И тогда на вашей странице оберточной что-то вроде этого в списке:

<CustomControls:ExpandableView> 
    <CustomControls:ExpandableView.Summary> 
     <StackLayout> 
      YOUR PARENT HERE 
     </StackLayout> 
    </CustomControls:ExpandableView.Summary> 
    <CustomControls:ExpandableView.Details> 
     <StackLayout> 
      YOUR CHILD LIST VIEW HERE 
     </StackLayout> 
    </CustomControls:ExpandableView.Details> 
</CustomControls:ExpandableView> 
Смежные вопросы