因此,我有一个列表框,它使用数据模板绑定到业务对象列表:
<DataTemplate x:Key="msgListTemplate">
<Grid Height="17">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding MaxWidth}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Foreground="Silver" Text="{Binding SequenceNo}" />
<TextBlock Grid.Column="1" Text="{Binding MessageName}" />
</Grid>
</DataTemplate>
<ListBox Name="msgList"
Grid.Column="0"
ItemTemplate="{StaticResource msgListTemplate}"
SelectionChanged="msgList_SelectionChanged"
VirtualizingStackPanel.IsVirtualizing="True"
ScrollViewer.HorizontalScrollBarVisibility="Hidden">
</ListBox>
装订后的某个时候,我想给列表中的某些项目上色,以便与其他项目区分开来。我在后台线程上执行此操作:
if(someCondition)
{
msgList.Dispatcher.BeginInvoke(new Fader(FadeListItem), DispatcherPriority.Render, request);
}
delegate void Fader(GMIRequest request);
void FadeListItem(GMIRequest request)
{
ListBoxItem item =
msgList.ItemContainerGenerator.ContainerFromItem(request) as ListBoxItem;
if(item!=null)
item.Foreground = new SolidColorBrush(Colors.Silver);
}
这一切都很好,一些列表项如预期的那样灰显。但是,如果滚动到不再显示灰色项目,那么再次滚动到它们原来的位置,它们不再是银色的,并且已经返回到默认的黑色前景。
你知道这是为什么吗,或者怎么解决?是因为我把isvirtualization设置为true吗?列表框通常包含许多项(20000项并不少见)。