我有一个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
中的所有变体,遗憾的是,没有任何变化。
我还应该尝试什么?
答案 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);