C# Xamarin.Forms CollectionView查看回收问题

C# Xamarin.Forms CollectionView查看回收问题,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,因此,我使用CollectionView来显示一个实体列表,当按下该列表时,可以在打开和关闭状态之间切换。为此,我设置了被按下视图的父容器的HeightRequest参数的动画,然后添加我想要在视图的展开状态中显示的任何视图。以下是用于此目的的代码片段: var animate = new Animation(d => this.HeightRequest = d, this.Bounds.Height, this.Bounds.Height + 300, Easing.Cubic

因此,我使用CollectionView来显示一个实体列表,当按下该列表时,可以在打开和关闭状态之间切换。为此,我设置了被按下视图的父容器的HeightRequest参数的动画,然后添加我想要在视图的展开状态中显示的任何视图。以下是用于此目的的代码片段:

var animate = new Animation(d => this.HeightRequest = d,
    this.Bounds.Height, this.Bounds.Height + 300, Easing.CubicOut);
animate.Commit(this, "a", length: 500);

this.layout.Children.Add(this.candidateList);
this.layout.Children.Add(this.openButton);
这很好,但是,如果我向下滚动列表,我会看到一些视图也会被扩展,即使我以前没有触摸它们,更重要的是,以后滚动的每一整页。有些甚至包括我添加到扩展状态的视图,显示不正确的数据。我假设这是由于CollectionView工作的回收机制,以节省渲染成本,但必须有某种方法来解决这一问题。以下是相关视图的代码:

var officesList = new CollectionView
{
    ItemTemplate = new DataTemplate(typeof(OfficeListView)),
    HorizontalOptions = LayoutOptions.FillAndExpand,
    ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
        SnapPointsType = SnapPointsType.None,
        ItemSpacing = 10,
    },
    Margin = new Thickness(20, 5),
    ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
    Footer = " ",
    FooterTemplate = new DataTemplate(() =>
    {
        return new StackLayout
        {
            Margin = new Thickness(20, 10),
            Children = {
                new LocorumLabels.MediumLabel
                {
                    Text = "x Results | No filters applied" //TODO: Bind these to footer
                }
            }
        };
    })


};
下一个片段是展开的“Office”中的CollectionView:

下面是一段视频,展示了正在发生的事情:


希望有人能让我知道一个解决方案。非常感谢。

你说得对

由于
CollectionView
使用
DataTemplate
,因此您需要设置视图和数据,以便在回收视图时,视图能够正常显示


保持动画工作的不明显的部分是从现在起调用动画,但在动画完成时在数据中设置值,该值会将视图从动画之前的状态更改为动画之后的状态。

谢谢您的回答。我的DataTemplate对象中确实有一个状态字段,但我只使用它来跟踪视图是打开还是关闭。两个问题:当我向下滚动列表时,滚动到的视图是否被创建为新对象(而我滚动的视图是垃圾收集的)?这是否意味着我的构造函数中需要这样的代码:“嘿,你的状态是扩展的,所以你需要这个大小”还是我把它放在其他地方?@MarcusOrciuch简单地说,你需要先让它在没有动画的情况下工作,然后在需要的地方添加动画并推迟数据设置,直到动画完成。因此我发现每次在我的CollectionView中显示新视图时,都会调用构造函数,因此,我创建了一个方法,该方法将根据绑定上下文对象的状态尝试调整视图的大小。此方法在构造函数和TapSignature回调结束时调用。我将一个bool作为参数传递,以设置状态更改的动画,就像点击它一样。然而,它似乎仍然不起作用。它的行为仍然像原始视频一样,并且(使用断点)在我以随机间隔滚动时,构造函数似乎被调用。也很抱歉响应太晚。另外,我在创建内部CollectionsView的行上放置了一个断点,当我点击第一个控件时,它会中断。从理论上讲,如果我向下滚动到模拟原始视图的随机视图(因为正在创建此视图,并且正在调用我的布局方法),它也应该会中断。但是,发生这种情况时,它不会中断。请确保您在UI线程中调用了动画。@LucasZhang MSFT似乎不起作用。我将改变我对这个问题的看法,因为事实证明这是一个艰巨的挑战。我将使用Rg.pouppage来显示与CollectionView分开的扩展视图,而不是更改CollectionView中的布局。
this.candidateList = new CollectionView
{
    ItemTemplate = new DataTemplate(typeof(CandidateDetailView)),
    HorizontalOptions = LayoutOptions.FillAndExpand,
    ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
        SnapPointsType = SnapPointsType.None,
        //ItemSpacing = 10,
    },
    Margin = new Thickness(10, 5),
    ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
    Footer = " ",
    HeightRequest = 300

};