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}


        }));
      
    }
}