代码之家  ›  专栏  ›  技术社区  ›  Winston Smith

wpf listbox项在滚动后丢失程序设置的样式

  •  1
  • Winston Smith  · 技术社区  · 16 年前

    因此,我有一个列表框,它使用数据模板绑定到业务对象列表:

    <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项并不少见)。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Ana Betts    16 年前

    是因为我把isvirtualization设置为true吗?列表框通常包含许多项(20000项并不少见)。

    你把它钉住了-一旦用户滚走,你设置前景颜色的项目就会被丢弃。

    当你有了正确的总体想法,你这样做的方式是一个非常不wpfy的方法-一个更好的方法是在你的业务对象类中有一个bool-dp(或者让bo实现inotifypropertieschanged),然后通过一个返回的自定义ivalueConverter(isrue)将bool绑定到前景颜色。粉刷:灰白色)。

    由于您可能不希望/可能无法修改业务对象以支持inotifyPropChanged,这就是m-v-v m模式的原因-创建一个类,该类包装属于DependencyObject的对象,并只公开您感兴趣显示的属性。