窗口电话7中ListBox行的交替行背景颜色

时间:2012-05-10 11:17:19

标签: windows-phone-7

我试图在窗口手机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。

我该如何解决这个问题,请帮助我?

3 个答案:

答案 0 :(得分:3)

您会看到此行为,因为它取决于调用转换器的项目的顺序。滚动虚拟化列表时,不保证这是顺序的。

您需要根据项目中的内容执行颜色选择。

您可以直接向项目添加背景属性,也可以将选择基于每个项目的属性。例如,如果列表中的每个项目都有顺序索引,您可以更改转换器以根据索引是奇数还是偶数来选择颜色。

答案 1 :(得分:0)

我遇到了一个非常类似的问题,最后在ListBox中显示的ViewModel项目中添加了一个新属性,该项目设置了颜色/不透明度。不太好,因为无论何时将任何内容添加到列表中都需要重新计算。

答案 2 :(得分:0)

为什么不将listbox datatemplate的stackpanel背景与viewmodel中的SolidColorBrush对象绑定。并且ObservalCollection的项索引是奇数还是偶数,datatemplate可以自己设置颜色。