我试图在窗口手机7的列表框中给出备用行样式。
我使用了以下内容:如果我的行数很少,那就有用了。
<ListBox x:Name="ListBox1" Width="500" Height="300">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="500" Background="{Binding age,Converter={StaticResource myconverter}}">
<TextBlock Text="Some text"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是我改变背景颜色的转换器:
public class MyConverter : IValueConverter
{
bool flag = false;
SolidColorBrush brush1 = new SolidColorBrush(Color.FromArgb(255, 100, 200, 255));
SolidColorBrush brush2 = new SolidColorBrush(Color.FromArgb(255, 200, 100, 155));
public object Convert(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
flag = !flag;
return flag ? brush1 : brush2;
}
public object ConvertBack(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
绑定后,它为我的列表框提供了备用行背景颜色。 但是如果列表框有太多行,当我快速向上和向下滚动它然后行颜色改变,因为它在滚动列表框时再次调用Converter。
我该如何解决这个问题,请帮助我?
答案 0 :(得分:3)
您会看到此行为,因为它取决于调用转换器的项目的顺序。滚动虚拟化列表时,不保证这是顺序的。
您需要根据项目中的内容执行颜色选择。
您可以直接向项目添加背景属性,也可以将选择基于每个项目的属性。例如,如果列表中的每个项目都有顺序索引,您可以更改转换器以根据索引是奇数还是偶数来选择颜色。
答案 1 :(得分:0)
我遇到了一个非常类似的问题,最后在ListBox中显示的ViewModel项目中添加了一个新属性,该项目设置了颜色/不透明度。不太好,因为无论何时将任何内容添加到列表中都需要重新计算。
答案 2 :(得分:0)
为什么不将listbox datatemplate的stackpanel背景与viewmodel中的SolidColorBrush对象绑定。并且ObservalCollection的项索引是奇数还是偶数,datatemplate可以自己设置颜色。