0

WPF ListView コントロールに奇妙な動作があります。
ListViews ItemSource は監視可能なコレクションです。ItemSource は定期的に更新されます。
アイテムの1つを選択してから、他のアイテムを選択し、アイテムが更新されていない場合、すべて問題ありません。
しかし、アイテムを選択しているときに、立っている間に更新され、他のアイテムを選択すると、1 つではなく 2 つのアイテムが選択されるようになりました。
デバッガーで見ていると、SelectionChanged イベントのイベント引数が表示されます。追加されたアイテムは問題ありませんが、削除されたアイテムはありません。
誰が問題を知っていますか?
ありがとう!

編集:

私の観察可能なコレクション:

    protected class CustomObservableCollection : ObservableCollection<T>
    {
        public void Refresh()
        {
            ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(this));
            lcv.Refresh();
        }
    }

アイテムに変更があったときに呼び出される更新メソッド ウィッチ:

    public void RefreshItem(T domainObject)
    {
        foreach (T item in obsCollection) {
            if (!DomainObjectComparer.Equals(domainObject, item)) continue;
            DomainObjectCopier.CopyProperties(domainObject, item);
            obsCollection.Refresh();
            break;
        }
    }
4

2 に答える 2

0

あなたのコピー機クラスはあなたのコレクションの2つのアイテムを等しくしているように見えます(私は、上記の限られた量のコードからこれを推測していると思います)。

ListViewで2つ以上のアイテムが同じ(等しい)場合、選択ロジックで等式比較子が使用されるため、1つを選択するとすべてが選択されます。

于 2012-04-10T11:43:00.790 に答える
0

どうやら問題は、ListView アイテム オブジェクトのオーバーライドされた GetHashCode() メソッドにあったようです。ハッシュ コードには、その計算にすべてのフィールドが含まれていました。すべてのフィールド (プロパティ) を削除し、オーバーライドされた GetHashCode() はアイテムの ID に基づいてハッシュを計算するだけになりました。それは問題を解決しました。
Equals() メソッドもオーバーライドしています。
誰かがなぜそれが関連しているのか知っているなら、私は知りたい.

于 2012-04-11T08:28:07.183 に答える