0

我正在尝试在窗口电话 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();
        }
    }

绑定后,它为我的 listbox 提供了备用行背景颜色。但是,如果列表框在我快速向上和向下滚动时有太多行,那么行颜色会改变,因为它在滚动列表框时再次调用转换器。

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

4

3 回答 3

3

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

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

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

于 2012-05-10T12:14:09.470 回答
0

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

于 2012-05-10T12:05:57.053 回答
0

为什么不将列表框数据模板的堆栈面板背景与视图模型中的 SolidColorBrush 对象绑定。无论 ObservalCollection 的项目索引是奇数还是偶数,数据模板都可以有自己的颜色。

于 2012-05-11T14:08:16.610 回答