请考虑以下问题:
我有一个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函数在发生时触发,它看起来像某种内存问题。
对此有任何建议将不胜感激。
答案 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/