【问题标题】:Nested ListView is not working in xamarin forms嵌套的 ListView 在 xamarin 表单中不起作用
【发布时间】:2018-05-09 01:35:58
【问题描述】:

嵌套列表视图不起作用,我有一个列表,其中包含另一个列表。为了在视图中显示它,我使用的是嵌套列表视图;但是代码不起作用,我无法确定它出错的地方......下面是我的代码

主页

<ContentPage.Content>
    <StackLayout>
        <ListView  x:Name="outerListview"   ItemsSource="{Binding lst}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell x:Name="outerListviewCell">
                        <ViewCell.View>
                            <ContentView>
                                <Label Text="{Binding ItemName}"/>
                                <StackLayout>
                                    <ListView ItemsSource="{Binding ItemList}">
                                        <ListView.ItemTemplate>
                                            <DataTemplate>
                                                <ViewCell x:Name="InnerListviewCell">
                                                    <Grid>
                                                        <Label Text="{Binding stockQty}"/>
                                                    </Grid>
                                                </ViewCell>
                                            </DataTemplate>
                                        </ListView.ItemTemplate>
                                    </ListView>
                                </StackLayout>
                            </ContentView>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

视图模型

public MainPageViewModel()
{
    lst = new ObservableCollection<A>()
    {
        new A()
        {
            ItemName="Item1", ItemList=new ObservableCollection<ItemDetails>()
                {
                    new ItemDetails() { stockQty="2"},
                    new ItemDetails(){ stockQty="3"}
                }
        },
        new A()
        {
            ItemName="Item2", ItemList=new ObservableCollection<ItemDetails>()
                {
                    new ItemDetails() { stockQty="3"},
                    new ItemDetails(){ stockQty="4"}
                }
         }
     };
}

模型(Class A 和 Class Itemdetails)

class A:INotifyPropertyChanged
{
    public A()
    {
        ItemName = string.Empty;
        ItemList = new ObservableCollection<ItemDetails>();
    }
    private string _ItemName;
    public string ItemName
    {
        get { return _ItemName; }
        set { _ItemName = value; OnPropertyChanged(); }
    }
    private ObservableCollection<ItemDetails> _itemlist;
    public ObservableCollection<ItemDetails> ItemList
    {
        get { return _itemlist; }
        set { _itemlist = value; OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
    }
}
class ItemDetails:INotifyPropertyChanged
{
    private string _stockQty;
    public string stockQty
    {
        get { return _stockQty; }
        set { _stockQty = value; OnPropertyChanged(); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
    }
}

当我运行上面的代码时,我在屏幕上得到下面的输出

2
3

实际预期的是

Item1
2
3
Item2
3
4

上面的代码有什么问题?谁能帮帮我?

【问题讨论】:

    标签: xaml xamarin xamarin.ios xamarin.forms xamarin.android


    【解决方案1】:

    这是绝对错误的。您必须使用一个将 IsGroupingEnabled 设置为 True 的 ListView。 按照此处的说明使其正常工作:https://xamarinhelp.com/xamarin-forms-listview-grouping/

    【讨论】:

      【解决方案2】:

      检查你的代码后,我发现你的代码有一些地方需要修改。

      1. 为了显示 ItemName ,您应该将 Label 包裹在 StackLayout 中。

      2. 为了得到Uneven Row,你应该设置listview.HasUnevenRows = true

      修改你的代码如下:

      <ContentPage.Content>
          <ListView  x:Name="outerListview" HasUnevenRows="True" ItemsSource="{Binding lst}">
              <ListView.ItemTemplate>
                  <DataTemplate>
                      <ViewCell x:Name="outerListviewCell">
                          <ViewCell.View>
                              <ContentView>
                                  <StackLayout>
                                      <Label Text="{Binding ItemName}"/>
                                      <ListView ItemsSource="{Binding ItemList}" RowHeight="20">
                                          <ListView.ItemTemplate>
                                              <DataTemplate>
                                                  <ViewCell x:Name="InnerListviewCell">
                                                      <Grid>
                                                          <Label Text="{Binding stockQty}"/>
                                                      </Grid>
                                                  </ViewCell>
                                              </DataTemplate>
                                          </ListView.ItemTemplate>
                                      </ListView>
                                  </StackLayout>
                              </ContentView>
                          </ViewCell.View>
                      </ViewCell>
                  </DataTemplate>
              </ListView.ItemTemplate>
          </ListView>
      </ContentPage.Content>
      

      【讨论】:

        【解决方案3】:

        在另一个 Listview 中嵌套 Listview 不是一个好主意,而且 Xamarin.Forms 不支持它。

        ListView 非常“敏感”,它很容易导致滚动问题,当然还有应用程序性能不佳的问题。

        所以我强烈建议你重新考虑你的布局,看看 Grouping with ListView 更多关于它here,也许你可以通过 Grouping 实现你想要的。

        【讨论】:

        • 阿尔米尔,感谢您的回复。实际上我无法更改布局,必须使用嵌套 ListView。我将收到对象列表,每个对象都包含项目列表;我需要显示所有,我不能分组。
        • 使用分组并不意味着改变布局。您可以使用正确的方法拥有相同的布局,即按照@AlmirVuk 建议的方式分组列表视图
        猜你喜欢
        • 2017-10-20
        • 2014-08-17
        • 2019-12-13
        • 2017-07-22
        • 2017-11-19
        • 1970-01-01
        • 2020-07-07
        • 2014-12-26
        • 2017-09-19
        相关资源
        最近更新 更多