,我不会建议使用可扩展的ListView,因为它可能会导致性能问题时,有更多数据。
但是,如果你想实现它遵循以下步骤:
你的模型应该像列表列表内
public class Model1
{ public string Name { get; set; } public List<Model2> Model2Name { get; set; }
} public class Model2 { public string Name1 { get; set; } }
在此处输入代码
然后你的XAML应该像
<ListView
HasUnevenRows="True"
ItemSelected="ItemSelected"
ItemsSource="{Binding DataList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="9*"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Text="{Binding Name}" YAlign="Center"/>
<ListView Grid.Row="1"
IsVisible="{Binding ListVisibility}"
SeparatorVisibility="None"
ItemSelected="ProductSelected"
HeightRequest="220"
BackgroundColor="#f2f2f2"
HorizontalOptions="FillAndExpand"
ItemsSource="{Binding Model.Products}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0" Text="{Binding Name}"
YAlign="Center" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
现在你必须包装你的模型。对于你必须写一个包装类如下:
public class WrapperModel<T> : INotifyPropertyChanged
{
public T Model { get; set; }
public event PropertyChangedEventHandler PropertyChanged = delegate { };
bool listVisibility = false;
public bool ListVisibility
{
get
{
return listVisibility;
}
set
{
if (listVisibility != value)
{
listVisibility = value;
PropertyChanged(this, new PropertyChangedEventArgs("ListVisibility"));
}
}
}
}
现在,在视图模型,你必须声明你的列表属性如下:
private List<WrapperModel<ProductCategoryModel>> dataList;
public List<WrapperModel<ProductCategoryModel>> DataList
{
get { return dataList; }
set
{
dataList = value;
OnPropertyChanged("DataList");
}
}
现在初始化列表如下:
foreach (var item in List)
{
DataList.Add(new WrapperModel<ModelName>
{ Model = item, ListVisibility = false});
}
现在列表将处于折叠状态。要获得点击每个项目内部列表,你必须设置ItemSelected如下:
private void ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null) return;
var tappedItem = (WrapperModel<ModelName>)e.SelectedItem;
tappedItem.ListVisibility = !tappedItem.ListVisibility;
((ListView)sender).SelectedItem = null;
}
如果您有疑问,请让我知道