WPF 网格视图样式绑定不会在所有列上更新

本文关键字:更新 视图 网格 样式 绑定 WPF | 更新日期: 2023-09-27 18:30:45

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

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

我该怎么做才能变通解决此问题?

<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>

WPF 网格视图样式绑定不会在所有列上更新

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

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

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

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

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

我应该做什么:

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

然后所有的二传手都被击中,事件被触发,一切都像我预期的那样进行。

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