WPF GridView样式绑定不会在所有列上更新

时间:2013-09-09 14:05:26

标签: c# wpf

在我的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>

1 个答案:

答案 0 :(得分:0)

评论有点长,您如何在对象上设置Color?在制作小型模型时,我能够轻轻地复制您描述的错误。

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

然后我遍历集合,使用这样的行将Color更改为新的内容:

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

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

我应该做些什么:

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

然后所有的设置者都被击中,事件被触发,一切都按照我的预期运作。

这可能不是你发生的事情。