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

时间:2018-09-28 07:19:08

标签: xamarin xamarin.forms expandablelistview listviewitem

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

2 个答案:

答案 0 :(得分:1)

要对要使用DataTemplateSelector的不同单元使用不同的模板,请参见此处:Creating a Xamarin.Forms DataTemplateSelector

首先在单独的类中对其进行定义:

/**
 * validation rule
 * @param string $attribute_name
 * @param array $params
 */
public function either($attribute_name, $params)
{
    /**
     * validate actula attribute
     */
    if(!empty($this->$attribute_name)){
        return;
    }

    if(!is_array($params['other'])){
        $params['other'] = [$params['other']];
    }

    /**
     * validate other attributes
     */
    foreach($params['other'] as $field){
        if(!empty($this->$field)){
            return;
        }
    }

    /**
     * get attributes labels
     */
    $fieldsLabels = [$this->getAttributeLabel($attribute_name)];
    foreach($params['other'] as $field){
        $fieldsLabels[] = $this->getAttributeLabel($field);
    }

    $this->addError($attribute_name, \Yii::t('poker_reg', 'One of fields "{fieldList}" is required.',[
        'fieldList' => implode('"", "', $fieldsLabels),
    ]));

}

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

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>

要想扩展/隐藏单元格,您需要:

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

答案 1 :(得分:0)

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你去了

注意:这是为澄清起见而编写的,已经过测试。