C# 将CollectionView滚动到ItemGroup
我有一个带有组的C# 将CollectionView滚动到ItemGroup,c#,xaml,xamarin.forms,C#,Xaml,Xamarin.forms,我有一个带有组的CollectionView。每个组都有一个带日期的字符串 随后,我创建了一个CarouselView,其中包含CollectionView组的所有日期 我试图创建一种方法来滚动CarouselView的元素,从而将CollectionView滚动到相应的组,但它不起作用 CollectionView保持静止 <CollectionView x:Name="CollectionDiary"....../> c# 公共类组:Observable
CollectionView
。每个组都有一个带日期的字符串
随后,我创建了一个CarouselView
,其中包含CollectionView
组的所有日期
我试图创建一种方法来滚动CarouselView
的元素,从而将CollectionView
滚动到相应的组,但它不起作用
CollectionView
保持静止
<CollectionView x:Name="CollectionDiary"....../>
c#
公共类组:ObservableCollection
{
公共字符串名称{get;private set;}
公共组(字符串名称,ObservableCollection图标):基(图标)
{
名称=名称;
}
}
public observetecollection tothumb{get;private set;}=new observetecollection();
幽默组=新幽默组(“月”+“”+年,新观察到的集合());
添加(组);
组。添加(项目日志);
私有无效ScrollCollectionView_已单击(对象发送者,事件参数e)
{
var current=CarouselView.CurrentItem作为组;
CollectionDiary.ScrollTo(当前,位置:ScrollToPosition.Start);
}
我正在尝试创建一种方法来滚动CarouselView的元素,从而将CollectionView滚动到相应的组,但它不起作用
我同意Jason的观点,您可以让CollectionView滚动到CarouseView_滚动事件中当前组的第一项
private void CarouselView_Scrolled(object sender, ItemsViewScrolledEventArgs e)
{
var current = CarouselView1.CurrentItem as HumorGroup;
if(current!=null)
{
CollectionDiary.ScrollTo(current.FirstOrDefault(),ScrollToPosition.Center);
}
}
我提供了一个示例,您可以查看:
<StackLayout>
<CarouselView
x:Name="CarouselView1"
ItemsSource="{Binding humors}"
Scrolled="CarouselView_Scrolled">
<CarouselView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text="{Binding Name}" />
</StackLayout>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<CollectionView
x:Name="CollectionDiary"
HeightRequest="100"
IsGrouped="True"
ItemsSource="{Binding humors}"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding name}" />
<Label Text="{Binding count}" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.GroupHeaderTemplate>
<DataTemplate>
<Label
BackgroundColor="LightGray"
FontAttributes="Bold"
FontSize="Large"
Text="{Binding Name}" />
</DataTemplate>
</CollectionView.GroupHeaderTemplate>
</CollectionView>
</StackLayout>
public partial class Page8 : ContentPage
{
public GroupHumorViewmodel groups { get; set; }
public Page8()
{
InitializeComponent();
groups = new GroupHumorViewmodel();
this.BindingContext =groups;
}
private void CarouselView_Scrolled(object sender, ItemsViewScrolledEventArgs e)
{
var current = CarouselView1.CurrentItem as HumorGroup;
if(current!=null)
{
CollectionDiary.ScrollTo(current.FirstOrDefault(),ScrollToPosition.Center);
}
}
}
public class HumorDiary
{
public string name { get; set; }
public int count { get; set; }
}
public class HumorGroup:ObservableCollection<HumorDiary>
{
public string Name { get; set; }
public HumorGroup(string name, ObservableCollection<HumorDiary> humor) : base(humor)
{
Name = name;
}
}
public class GroupHumorViewmodel
{
public ObservableCollection<HumorGroup> humors { get; set; }
public GroupHumorViewmodel()
{
humors = new ObservableCollection<HumorGroup>();
humors.Add(new HumorGroup("2021",new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2021-day1",count=3},
new HumorDiary(){name="2021-day2",count=3},
new HumorDiary(){name="2021-day3",count=4},
new HumorDiary(){name="2021-day4",count=2},
new HumorDiary(){name="2021-day5",count=5},
new HumorDiary(){name="2021-day6",count=4},
new HumorDiary(){name="2021-day7",count=2},
new HumorDiary(){name="2021-day8",count=5}
}));
humors.Add(new HumorGroup("2020", new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2020-day1",count=3},
new HumorDiary(){name="2020-day2",count=3},
new HumorDiary(){name="2020-day3",count=4},
new HumorDiary(){name="2020-day4",count=2},
new HumorDiary(){name="2020-day5",count=5},
new HumorDiary(){name="2020-day6",count=4},
new HumorDiary(){name="2020-day7",count=2},
new HumorDiary(){name="2020-day8",count=5}
}));
humors.Add(new HumorGroup("2019", new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2019-day1",count=3},
new HumorDiary(){name="2019-day2",count=3},
new HumorDiary(){name="2019-day3",count=4},
new HumorDiary(){name="2019-day4",count=2},
new HumorDiary(){name="2019-day5",count=5},
new HumorDiary(){name="2019-day6",count=4},
new HumorDiary(){name="2019-day7",count=2},
new HumorDiary(){name="2019-day8",count=5}
}));
}
}
公共部分类第8页:内容页
{
公共组模型组{get;set;}
公共页8()
{
初始化组件();
groups=新的groupViewModel();
this.BindingContext=组;
}
私有void CarouselView_滚动(对象发送者,ItemsViewScrolledEventArgs e)
{
var current=CarouselView1.CurrentItem作为组;
如果(当前!=null)
{
CollectionDiary.ScrollTo(current.FirstOrDefault(),ScrollToPosition.Center);
}
}
}
公开课幽默日记
{
公共字符串名称{get;set;}
公共整数计数{get;set;}
}
公共类幽默组:ObservableCollection
{
公共字符串名称{get;set;}
公共幽默组(字符串名称,ObservableCollection幽默):基础(幽默)
{
名称=名称;
}
}
公共类组视图模型
{
公共可观察收集幽默{get;set;}
公共组视图模型()
{
体液=新观察到的集合();
添加(新的体液组(“2021”,新的可观察集合)(){
new HumorDiary(){name=“2021-day1”,count=3},
new HumorDiary(){name=“2021-day2”,count=3},
new HumorDiary(){name=“2021-day3”,count=4},
new HumorDiary(){name=“2021-day4”,count=2},
new HumorDiary(){name=“2021-day5”,count=5},
new HumorDiary(){name=“2021-day6”,count=4},
new HumorDiary(){name=“2021-day7”,count=2},
新建日志(){name=“2021-day8”,计数=5}
}));
humors.添加(新的HumorGroup(“2020”,新的ObservableCollection)(){
new HumorDiary(){name=“2020-day1”,count=3},
new HumorDiary(){name=“2020-day2”,count=3},
new HumorDiary(){name=“2020-day3”,count=4},
new HumorDiary(){name=“2020-day4”,count=2},
new HumorDiary(){name=“2020-day5”,count=5},
new HumorDiary(){name=“2020-day6”,count=4},
new HumorDiary(){name=“2020-day7”,count=2},
新建日志(){name=“2020-day8”,计数=5}
}));
体液补充(新体液组(“2019”,新可观察集合)(){
新建日期({name=“2019-day1”,count=3},
新建日期({name=“2019-day2”,计数=3},
新建日期({name=“2019-day3”,计数=4},
新建日期({name=“2019-day4”,计数=2},
新建日期({name=“2019-day5”,count=5},
新建日期({name=“2019-day6”,count=4},
新建日期({name=“2019-day7”,计数=2},
新建日志(){name=“2019-day8”,计数=5}
}));
}
}
我会尝试查找组中的第一个项目并滚动到该项目,我需要CollectionView向上滚动到组名,而不是第一个元素,因为某些组可能是empty@trecchino从中,我们可以发现我们需要指定要跳转到该位置的特定项。有关于github的功能请求。
<StackLayout>
<CarouselView
x:Name="CarouselView1"
ItemsSource="{Binding humors}"
Scrolled="CarouselView_Scrolled">
<CarouselView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text="{Binding Name}" />
</StackLayout>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<CollectionView
x:Name="CollectionDiary"
HeightRequest="100"
IsGrouped="True"
ItemsSource="{Binding humors}"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding name}" />
<Label Text="{Binding count}" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.GroupHeaderTemplate>
<DataTemplate>
<Label
BackgroundColor="LightGray"
FontAttributes="Bold"
FontSize="Large"
Text="{Binding Name}" />
</DataTemplate>
</CollectionView.GroupHeaderTemplate>
</CollectionView>
</StackLayout>
public partial class Page8 : ContentPage
{
public GroupHumorViewmodel groups { get; set; }
public Page8()
{
InitializeComponent();
groups = new GroupHumorViewmodel();
this.BindingContext =groups;
}
private void CarouselView_Scrolled(object sender, ItemsViewScrolledEventArgs e)
{
var current = CarouselView1.CurrentItem as HumorGroup;
if(current!=null)
{
CollectionDiary.ScrollTo(current.FirstOrDefault(),ScrollToPosition.Center);
}
}
}
public class HumorDiary
{
public string name { get; set; }
public int count { get; set; }
}
public class HumorGroup:ObservableCollection<HumorDiary>
{
public string Name { get; set; }
public HumorGroup(string name, ObservableCollection<HumorDiary> humor) : base(humor)
{
Name = name;
}
}
public class GroupHumorViewmodel
{
public ObservableCollection<HumorGroup> humors { get; set; }
public GroupHumorViewmodel()
{
humors = new ObservableCollection<HumorGroup>();
humors.Add(new HumorGroup("2021",new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2021-day1",count=3},
new HumorDiary(){name="2021-day2",count=3},
new HumorDiary(){name="2021-day3",count=4},
new HumorDiary(){name="2021-day4",count=2},
new HumorDiary(){name="2021-day5",count=5},
new HumorDiary(){name="2021-day6",count=4},
new HumorDiary(){name="2021-day7",count=2},
new HumorDiary(){name="2021-day8",count=5}
}));
humors.Add(new HumorGroup("2020", new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2020-day1",count=3},
new HumorDiary(){name="2020-day2",count=3},
new HumorDiary(){name="2020-day3",count=4},
new HumorDiary(){name="2020-day4",count=2},
new HumorDiary(){name="2020-day5",count=5},
new HumorDiary(){name="2020-day6",count=4},
new HumorDiary(){name="2020-day7",count=2},
new HumorDiary(){name="2020-day8",count=5}
}));
humors.Add(new HumorGroup("2019", new ObservableCollection<HumorDiary>() {
new HumorDiary(){name="2019-day1",count=3},
new HumorDiary(){name="2019-day2",count=3},
new HumorDiary(){name="2019-day3",count=4},
new HumorDiary(){name="2019-day4",count=2},
new HumorDiary(){name="2019-day5",count=5},
new HumorDiary(){name="2019-day6",count=4},
new HumorDiary(){name="2019-day7",count=2},
new HumorDiary(){name="2019-day8",count=5}
}));
}
}