WPF ListView使用虚拟化集合时如何更改ListViewItem的行颜色?

问题描述

我正在使用WPF,并且我有两个从数据库填充的ListView。

ListView A:

     <ListView Name="MyListViewNameA" ItemsSource="{Binding SourceValues}" 
                          View="{Binding SourceValuesMappings,Converter={StaticResource MappingsConfigToGridViewConverter}}" 
                          SelectedItem="{Binding SelectedSourceValue}"/>

ListView B:

     <ListView Name="MyListViewNameB" ItemsSource="{Binding DestinationValues}" 
                          View="{Binding DestinationValuesMappings,Converter={StaticResource MappingsConfigToGridViewConverter}}" 
                          SelectedItem="{Binding SelectedDestinationValue}"/>

现在,ItemSource属性一个虚拟化的集合填充,该集合使用一个数据库获取数据的项目提供程序。

要澄清:当我向下或向上滚动到两个ListView时,虚拟化集合将进行管理,以基于索引和250条记录的页面大小来获取适当的记录。

同时, MappingsConfigToGridViewConverter 接受了一些也来自数据库的映射,并使用此映射创建了一些动态列。

当我从ListView A中选择一个项目,然后从ListView B中选择一个项目,然后单击一个按钮时,我将复杂对象添加到第三个ListView C中,如下所示:

    public class MyComplexObject
    {
        public ValueObject SourceValue { get; set; }

        public ValueObject DestinationValue { get; set; }

        public DatabaSEObject MatchedValuetoSavetoDatabase { get; set; }
    }

当我从ListView C添加删除记录时,我想分别从ListView A和ListView B添加删除所选项目。

要注意的是,虚拟化集合不支持添加删除。因此,我决定以视觉方式代替它。

问题在于,在视觉表示上,我不能仅仅基于所选项目更改可见性,因为当我获取另一页然后返回到上一页时,视觉提示将消失。

此外,虚拟化集合是我无法更改的黑盒。

我已经尝试过这样的转换器:

                    <ListView.ItemContainerStyle>
                        <Style targettype="ListViewItem">
                            <Setter Property="Background" Value="White"/>
                            <Style.Triggers>
                                <DataTrigger Value="True">
                                    <DataTrigger.Binding>
                                        <MultiBinding Converter="{StaticResource MyDataToBoolConverter}">
                                            <Binding RelativeSource="{RelativeSource Self}"/>
                                            <Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=UserControl}" Path="DataContext.MyComplexObjectList" />
                                        </MultiBinding>
                                    </DataTrigger.Binding>
                                    <DataTrigger.Setters>
                                        <Setter Property="Background" Value="Red"/>
                                    </DataTrigger.Setters>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ListView.ItemContainerStyle>

上面的代码能够触发我的转换器,但只能向上或向下滚动。当我向ListView C添加对象时不可以。

我也试图使用这样的事件:

    public ManualMatchProcessView()
    {
        InitializeComponent();

       ((INotifyCollectionChanged)SourceValues.Items).CollectionChanged += SourceValues_CollectionChanged;
    }

    private void SourceValues_CollectionChanged(object sender,NotifyCollectionChangedEventArgs e)
    {
    }

,但是第一次初始化集合时,事件仅触发一次。 并非每次获取虚拟化收藏集时都如此。

我要寻找的东西类似于ListViewItem完成绘制事件时的方式以及应该如何实现。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...