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