1

我的 XAML 中有列表框,几个复选框和过滤器按钮。我的应用程序会生成大量日志,这些日志会显示在列表框中。当我在列表框中有数据时,此 XAML 将执行的操作是用户将选中\取消选中复选框。基于此,单击按钮时将过滤列表框中的数据。根据数据,我想在每个项目上显示不同的前景色和背景色。

private void FilterButton_Click ( object sender , RoutedEventArgs e )
{
   //Whenever filter button is clicked, i will check for checkbox status. whichever //checkbox  is ON I will add checkbox name into Dictionary. Then I will read string from Listbox and extract particular keyword from that and match with Dictionary key. If it //matches then I will modify the background and foreground color for that particualr //listbox items. My problem here is only certain Listbox items get updated rest of them are //unchaged. When debugged i found that itemcontainergenerator returns null for all other //items. 
    for ( int i = 0 ; i < ListBox1.Items.Count ; i++ )
    {

    ListBoxItem item1 = ( ListBoxItem )ListBox1.ItemContainerGenerator.ContainerFromIndex(i);

        string recordType;
        string []  contentArray;

        if ( item1 == null )
            continue;
        if ( item1.Content == "" )
            continue;

        contentArray = item1.Content.ToString().Split( new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries );
        recordType = contentArray [ 1 ];

        if ( checkBoxType.ContainsKey ( recordType ))
            {
               //int code = RecordTypeToColorCode [ recordType ];
                //item1.Foreground = ColorCodeToForeColor [ code ];
                    item1.Foreground = Brushes.DarkCyan;
                    item1.FontSize = 13;
                    item1.Background = Brushes.LightGoldenrodYellow;

            }
        else
            {
                item1.Foreground = Brushes.LightGray;
            }
    }
}

我看到的问题是,如果假设我的列表框有 1000 个项目,那么只有 35-40 个项目被更新。其余所有项目都相同。我对代码进行了更多调试,发现在某个数字 35-40 之后,所有项目都为 null,这就是为什么我无法更新列表框中的所有项目的原因。我没有在我的代码中打开虚拟化。有什么办法可以更新所有项目。任何帮助表示赞赏。我在想 ItemCONtainerGenerator 是否有任何问题,因为它只显示某些项目,虚拟化也已关闭。

4

2 回答 2

0

你不应该那样做。相反,您的视图模型项目类中可能有一个布尔属性,用于控制项目是否实际被过滤(我们称之为IsFiltered)。然后,您将 DataTrigger 添加到ItemContainerStyleListBox 中,以设置受属性值影响的所有IsFiltered属性。当然,您还必须为该属性实现 INotifyPropertyChanged。

<ListBox ...>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Foreground" Value="LightGray"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsFiltered}" Value="True">
                    <Setter Property="Foreground" Value="DarkCyan"/>
                    <Setter Property="Background" Value="LightGoldenrodYellow"/>
                    <Setter Property="FontSize" Value="13"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    ...
</ListBox>

现在,每当过滤条件发生变化时,您将遍历项目集合(而不是容器),并IsFiltered为每个项目的属性设置一个值。

于 2013-08-20T07:46:04.037 回答
0

在此处输入图像描述

请查看下图更清楚;你理解这个问题

于 2013-08-20T01:18:47.327 回答