3

List<T>SubSonicによって生成されたエンティティタイプを保持するがあります。このタイプを呼びましょうNaughtyItem。のリストがNaughtyItemComboBoxにバインドされると、奇妙なことが起こり始めます*。ComboBoxは、次のようにコレクションに1つの方法でバインドされます。

<ComboBox  ItemsSource="{Binding Model.NaughtyCollection,Source={StaticResource ModelSource}}" Width="120" Margin="0,0,10,0" />

※初めてアイテムを選択すると、選択が変わります。ただし、アイテムを変更すると、アイテムを再度選択することはできません。私はイベントを購読しましたSelectionChanged、そしてそれはそれを解雇します、そしてそれはそれです。ラッパータイプを作成して問題を解決しました

public class NaughtyWrapper
{
   public NaughtyItem {get;set;}
}

私の推測では、NaughtyItemが行っていることが、ComboBoxのクラッシュと書き込みを引き起こしていると思われます。VisualStudioですべてのCLR例外をオンにしましたが、ラップされていないNaughtyItemが問題を引き起こしている理由を説明する興味深い例外はありません。

誰かが前にこのようなものに出くわしましたか?

4

2 に答える 2

1

すべてのクレジットは、答えのためにニコラス・レピケに行きます。

SubSonicのエンティティにEquals()は、この問題の原因となるカスタム実装があります。カスタム実装を削除すると問題は解決しますが、フレームワークをいじりたくないので、ラップされたSubSonicエンティティの元のソリューションを引き続き使用します。

public override bool Equals(object obj){
    if(obj.GetType()==typeof(NaughtyItem)){
        NaughtyItem compare=(NaughtyItem)obj;
        return compare.KeyValue()==this.KeyValue();
    }else{
        return base.Equals(obj);
    }

}

于 2012-11-20T15:26:09.880 に答える
0

ニコラスが答えない場合。

私が思うのは、複数のアイテムが同じKeyValueを持っているということです。

キーが重複すると他のエラーが発生する可能性があるため、構成を確認して一意のKeyValueを生成することをお勧めします。
それを包むことは問題を隠すだけです。

UIでアイテムを選択すると、現在選択されているアイテムと比較されます。
それらが等しい場合、アイテムはすでに選択されていると見なされ、何もしません。

それをラップすると、オブジェクトからGetHashCodeとEqualsを取得し、オブジェクトが正しい答えを返します(すべてのオブジェクトは一意です)。

于 2012-11-20T19:29:13.777 に答える