0

在我的 wpf 应用程序中,我设置了一个网格视图,其中项目样式应用于所有列。绑定的属性之一是每个单元格中 TextBlock 的前景色。我将颜色包装在一个简单的对象中,这样当颜色改变时,它会通知列表中过去的项目也更新。

但是,当我更改颜色时,并非所有列表项都正确更新。绑定正在起作用,但某些细胞保持其旧颜色。如果我向下滚动列表并备份,那么所有单元格都会正确更新。似乎这可能是列表虚拟化的问题。它似乎也可能是一个错误,因为只有某些列没有在同一行中更新。

我可以做些什么来解决这个问题?

<ListView.View>
            <GridView>
                <GridViewColumn Header="No." Width="50">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Style="{StaticResource MessageListItemStyle}"
                                                               Text="{Binding Id}" HorizontalAlignment="Right"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
...

颜色类:

public class Color : INotifyPropertyChanged
{
    private Brush _brush;

    public Color(Brush brush)
    {
        _brush = brush;
    }

    public Brush Value
    {
        get
        {
            return _brush;
        }
        set
        {
            if (!Equals(_brush, value))
            {
                _brush = value;
                var changed = PropertyChanged;
                if (changed != null)
                    changed(this, new PropertyChangedEventArgs("Value"));
            }
        }
    }

风格:

<Style x:Key="MessageListItemStyle" TargetType="{x:Type TextBlock}">
    <Setter Property="Foreground" Value="{Binding ForeColor.Value}" />
</Style>
4

1 回答 1

0

有点长的评论,你是如何设置你Color的对象的?在制作小模型时犯了一个小错误后,我能够复制您描述的错误。

我像您在上面所做的那样绑定了 a ListView,并创建了一个包含 100 个具有Foreground属性的对象的集合,并初始化为一个 new SolidColorBrush。所有对象都设置为初始颜色,没有问题。

然后我遍历集合以Color使用如下行将其更改为新内容:

p.ForeColor = new Color(new SolidColorBrush(...));

所以这是我的错误,因为我Color每次都设置一个新的,ForeColor属性上的设置器永远不会触发,所以没有PropertyChanged事件被触发。只有当前不在视图中的项目被更新,其他项目保持不变,直到我将它们完全滚动到视图之外。

我应该做的:

p.ForeColor.Value = new SolidColorBrush(...);

然后所有的二传手都被击中,事件被触发,一切都按我的预期工作。

不过,这可能不是你正在发生的事情。

于 2013-09-09T17:55:42.210 回答