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>
评论有点长,您如何在对象上设置Color
?在制作小模型时犯了一个小错误后,我能够复制您描述的错误。
我像上面一样绑定了一个ListView
,并创建了一个包含 100 个具有 Foreground
属性的对象的集合,初始化为新SolidColorBrush
。所有对象都设置为初始颜色,没有问题。
然后,我遍历了集合,使用如下行将Color
更改为新内容:
p.ForeColor = new Color(new SolidColorBrush(...));
所以这是我的错误,因为我每次都设置一个新Color
,ForeColor
属性上的二传手永远不会触发,所以不会触发PropertyChanged
事件。只有当前不在视图中的项目才会更新,其他项目保持不变,直到我将它们一直滚动到视图中。
我应该做什么:
p.ForeColor.Value = new SolidColorBrush(...);
然后所有的二传手都被击中,事件被触发,一切都像我预期的那样进行。
不过,这可能不是发生在你身上的事情。