私の wpf アプリケーションでは、すべての列にアイテム スタイルが適用されたグリッド ビューが設定されています。バインドされるプロパティの 1 つは、各セルの 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>