ScrollTo不使用Xamarin.Forms

时间:2016-09-03 10:49:17

标签: c# xaml xamarin.forms

我有一个TabbedPage,其中包含一些由ContentPage组成的ContentView,其中一些ListView

ListView包含由自定义模型类代表的分组 ItemsSource

public class DataGroup: List<DataGroupItem>
{   
    public string HeaderText { get; set; }

    public string ShortName { get; set; } 

    public string SubTitle { get; set; }

    public DataGroup(string headerText, string shortName)
    {
        HeaderText= headerText;
        ShortName= shortName;
    }
}

XAML代码(它也有一个ItemTemplate):

<ListView x:Name="listView"
              Grid.Row="0"
              GroupDisplayBinding="{Binding HeaderText}"
              GroupShortNameBinding="{Binding ShortName}"
              HasUnevenRows="True"
              IsGroupingEnabled="True"
              ItemsSource="{Binding DataGroups}"
              SeparatorColor="Black"
              SeparatorVisibility="Default">
    ...
</ListView>

当我更改实际标签时,我需要将ListView滚动到某个组。

我使用此代码:

ObservableCollection<DataGroup> dataGroups
    = this.listView.ItemsSource as ObservableCollection<DataGroup>;
if (scrolling)
{        
    var res = dataGroups.Where(dg=>dg.ItemCount > 3).LastOrDefault();
    if (res != null)
        //Device.StartTimer(TimeSpan.FromMilliseconds(150), () =>
        //{
            this.listView.ScrollTo(res, ScrollToPosition.Center, false);
            //return false;
        //});
}

我尝试了ScrollToPosition中的所有变体,遗憾的是,没有任何变化。

我还应该尝试什么?

3 个答案:

答案 0 :(得分:4)

嗯,想出这个很冒险。

首先,我认为我应该将子项目设置为ScrollTo方法的目标,但它没有任何改变。

作为一个模糊的想法,我将SelectedItem添加到汤中,并且它有效,所以我将此作为最终结果:

ObservableCollection<DataGroup> dataGroups= this.listView.ItemsSource as ObservableCollection<DataGroup>;
if (scrolling)
{        
  var res = dataGroups.Where(dg=>dg.ItemCount > 3).LastOrDefault();
  if (res != null && res.Count > 0)
  {
    this.listView.SelectedItem = res[0];
    this.listView.ScrollTo(this.listView.SelectedItem, ScrollToPosition.MakeVisible, false);
  }
}

答案 1 :(得分:0)

尝试使用res [0]而不是res,如下所示:

public Node insert(Node current, int data) {
    if (current == null) {
        return createNode(data);
    } else if (data < current.data) {
        //RECURSIVE CALL HERE WITHOUT USE OF A RETURN STATEMENT
        current.left = insert(current.left, data);
    } else if (data > current.data) {
        current.right = insert(current.right, data);
    }

    return current;
}

答案 2 :(得分:0)

别忘了还要设置组。您需要同时设置组和项目,请参见下面的示例:

listView.ScrollTo(item, group, ScrollToPosition.Start, true);