0

私の 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>
4

1 に答える 1

0

コメントには少し長いですがColor、オブジェクトにどのように設定していますか? 小さなモックアップを作成しているときにわずかな間違いを犯した後、あなたが説明したエラーを再現することができました.

上記のようにa をバインドし、新しい に初期化されたプロパティListViewを持つ 100 個のオブジェクトのコレクションを作成しました。すべてのオブジェクトが問題なく初期色に設定されました。ForegroundSolidColorBrush

次に、コレクションを反復処理して、Color次のような行を使用して を新しいものに変更しました。

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

これは私の間違いでした。Color毎回新しいものを設定しているため、ForeColorプロパティのセッターが起動しないため、PropertyChangedイベントは発生しません。現在表示されていないアイテムのみが更新され、他のアイテムはスクロールして見えなくなるまで同じままです。

私がすべきだったこと:

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

次に、すべてのセッターがヒットし、イベントが発生し、すべてが期待どおりに機能します。

しかし、それはあなたに起こっていることではないかもしれません。

于 2013-09-09T17:55:42.210 に答える