Xamarin 表单中具有不同子项的可扩展 ListView

Posted

技术标签:

【中文标题】Xamarin 表单中具有不同子项的可扩展 ListView【英文标题】:Expandable ListView with different child items in Xamarin forms 【发布时间】:2019-03-04 03:42:03 【问题描述】:

关于如何在 Xamarin 表单中实现具有不同子视图的可扩展列表视图的任何建议。有人可以帮我吗?

【问题讨论】:

把你所有的内容放在一个StatckLayout中,你可以利用StackLayout的IsVisible属性来显示或隐藏Tapped时的StackLayout。需要更多说明吗? @OluwasayoBabalola 是的,请 我已经写了一个答案。如果有帮助,请告诉我。 【参考方案1】:

要为不同的单元格使用不同的模板,您需要使用 DataTemplateSelector,此处记录了它:Creating a Xamarin.Forms DataTemplateSelector

首先在单独的类中定义它:

public class PersonDataTemplateSelector : DataTemplateSelector

  public DataTemplate ValidTemplate  get; set; 
  public DataTemplate InvalidTemplate  get; set; 

  protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
  
    return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;
  

然后将其添加到您页面的资源中:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Selector;assembly=Selector" x:Class="Selector.HomePage">
    <ContentPage.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="validPersonTemplate">
                <ViewCell>
                   ...
                </ViewCell>
            </DataTemplate>
            <DataTemplate x:Key="invalidPersonTemplate">
                <ViewCell>
                   ...
                </ViewCell>
            </DataTemplate>
            <local:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
                ValidTemplate="StaticResource validPersonTemplate"
                InvalidTemplate="StaticResource invalidPersonTemplate" />
        </ResourceDictionary>
    </ContentPage.Resources>
  ...
</ContentPage>

然后在你的列表中使用它:

<ListView x:Name="listView" ItemTemplate="StaticResource personDataTemplateSelector" />

要能够展开/隐藏单元格,您需要:

为特定列表项的 ViewModel 添加属性 IsExpanded 在列表的 ItemSelected 事件上将其更改为 true/false 将要隐藏/展开的视图的可见性绑定到 IsExpanded 的值

【讨论】:

不要犹豫,询问您是否对这些模板有一些问题,如果它解决了您的问题,请记住将答案标记为已接受:)【参考方案2】:

XAML

   <ListView ItemsSource="Binding YOUR_SOURCE" SeparatorVisibility="Default" 
             HasUnevenRows="True" ItemSelected="MyList_ItemSelected"> 
      <ListView.ItemTemplate>
          <DataTemplate>
             <ViewCell>
                <Frame>
                   <StackLayout>
                      <Label Text="My Heading"/>
                   </StackLayout>

                   <StackLayout x:Name="moreItemStack" Orientation="Horizontal" 
                                IsVisible="false">
                       <Label Text="child 1"/>
                       <Label Text="child 2"/>
                   </StackLayout>
               </Frame>
            </ViewCell>
         </DataTemplate>
      </ListView.ItemTemplate>
    <ListView>

C#

  private void MyList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
  
      var myItem = e.SelectedItem; 
      moreItemStack.IsVisible = true;          
  

@user3932639 好了

注意:这是为了澄清而写的,它已经过测试。

【讨论】:

以上是关于Xamarin 表单中具有不同子项的可扩展 ListView的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有棱镜的Xamarin表单中为contentview创建单独的视图模型?

如何在 Xamarin Forms 的可重用 ViewCell 中绑定命令?

如何从 ExpandableListView 的子项中删除分隔符?

具有绑定问题的 Xamarin 表单 FlyoutPage

具有可扩展列表视图项的Android列表视图

GridView在android中的可扩展列表中