我知道ExpandableListView,但只要我能看到ExpandableListView有一个项目列表作为子项。 我想要做的是有一个包含父项的列表,当我点击父项时,它会展开并显示更多信息。
注意:父项展开时显示的布局不是列表。它只是一个简单的布局,因为在每个例子中我都看到ExpandableListView与List一起用作子项,我不确定它是否是在这种情况下使用的正确控件。
可能的解决方案:我可以使用ExpandableListView并且列表中只有一个子项,但是我寻找的东西比只有一个项目的列表更优雅
ExpandableListView是否在此处使用正确的控件?
编辑:我使用的是Xamarin Native(Xamarin.Android),而不是Xamarin.Forms
答案 0 :(得分:0)
我不建议使用可扩展的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"));
}
}
}
}
现在在viewModel中,您必须按如下方式声明List属性:
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;
}
如果您有疑问,请告诉我