绑定到ObservableCollection的Xamarin ListView随机更改

时间:2018-04-23 13:59:23

标签: listview xamarin xamarin.forms observablecollection inotifypropertychanged

请考虑以下问题:

我有一个Xamarin Forms项目,使用ViewModels和XAML绑定。我有一个特定的ListView绑定到特定对象的ObservableCollection。

对象包含显示以下按钮列表所需的所有信息:

<ListView ItemsSource="{Binding ListViewItems}" Margin="0,20,0,0" RowHeight="130" SeparatorVisibility="None" VerticalOptions="FillAndExpand" Grid.Column="1" Grid.Row ="0" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Button Command="{Binding HeatClickedCommand}" Margin="5,10,5,10" HorizontalOptions ="FillAndExpand" BackgroundColor="{Binding color_hex}" Grid.Column="1" TextColor="{StaticResource LightTextColor}" FontSize="Medium" Text="{Binding heat_title}"></Button>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

首次加载页面时,colour_hex会设置为绿色,灰色或红色,具体取决于特定的应用状态和有关该对象的信息。首次显示列表时,屏幕上显示的所有按钮都显示正确,但最后的按钮看起来不是(最后4个应该是灰色的,而在调试中我已经回显了颜色应该是灰色的。)

然而,奇怪的是,如果某些按钮为绿色,则快速向上和向下滚动会显示更改哪些按钮随机设置为绿色。

例如,假设按钮1和2为红色,但3为绿色,如果我向下滚动至15,然后快速返回到顶部,则可能已更改,因此2现在为绿色,3为红色。

这似乎只发生在机器人(手机和平板电脑)上,但我还没有在足够多的设备上进行测试,但却无法确切地说出来。我只知道在Windows上不会发生这种情况。

检查Debug它看起来没有颜色更改函数或propertychanged函数在发生时触发,它看起来像某种内存问题。

对此有任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

查看let colorCircles = { 'a': '#59bcf9', 'b': '#faabab', 'd': '#ffde85' }; let tooltip = d3.select("body") .append("div") .attr("class", "tooltip-inner") .style("position", "absolute") .style("min-width", "12rem") .style("visibility", "hidden") .style("color", "#627386") .style("padding", "15px") .style("stroke", '#b8bfca') .style("fill", "none") .style("stroke-width", 1) .style("background-color", "#fff") .style("border-radius", "6px") .style("text-align", "center") .text(""); let bubble = d3.layout.pack() .sort(null) .size([width, diameter]) .padding(15) .value(function(d) { return d[columnForRadius]; }); let svg = d3.select("body") .append("svg") .attr("width", width) .attr("height", diameter) .attr("class", "bubble"); let nodes = bubble.nodes({ children: dataset }).filter(function(d) { return !d.children; }); let circles = svg.selectAll("circle") .data(nodes) .enter() .append("circle") .attr("r", function(d) { return d.r; }) .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y - 20; }) .style("fill", function(d) { return colorCircles[d[columnForColors]] }) .on("mouseover", function(d) { tooltip.style("visibility", "visible"); tooltip.html('<p>' + d[columnForColors] + ": " + d[columnForText] + "</p><div class='font-bold displayInlineBlock'> $" + d[columnForRadius] + '</div>'); }) .on("mousemove", function() { return tooltip.style("top", (d3.event.offsetY - 10) + "px").style("left", (d3.event.offsetX + 10) + "px"); }) // .on("mouseout", function() { // return tooltip.style("visibility", "hidden"); // }) .attr("class", "node"); circles.transition() .duration(1000) .attr("r", function(d) { return d.r; }) .each('end', function() { display_text(); }); function display_text() { let text = svg .selectAll(".text") .data(nodes, function(d) { return d[columnForText]; }); text.enter().append("text") .attr("class", "graphText") .attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y - 20; }) .attr("dy", ".2em") .attr("fill", "white") .attr("font-size", function(d) { return d.r / 5; }) .attr("text-anchor", "middle") .text(function(d) { console.log(d) return d[columnForText].substring(0, d.r / 3); }); text.enter().append("text") .attr("class", "graphText") .attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y - 20; }) .attr("dy", "1.3em") .style("text-anchor", "middle") .text(function(d) { return '$' + d[columnForRadius]; }) .attr("font-size", function(d) { return d.r / 5; }) .attr("fill", "white"); } function hide_text() { let text = svg.selectAll(".text").remove(); } d3.select(self.frameElement) .style("height", diameter + "px");属性及其功能。这可能是造成这种情况的原因。

此设置确定如何重复使用单元格。如果设置为错误的值(对于您的用例),可能会导致一些奇怪的行为。

更多信息可在文档中找到:https://developer.xamarin.com/api/type/Xamarin.Forms.ListViewCachingStrategy/