3

我有一个List<T>包含 SubSonic 生成的实体类型。我们称这种类型NaughtyItem。当列表NaughtyItem绑定到 ComboBox 时,奇怪的事情开始发生*。ComboBox 以一种方式绑定到集合,如下所示:

<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 异常,但是我没有得到任何有趣的异常来解释为什么未包装的 NaughtyItems 会导致问题。

以前有人遇到过这样的事情吗?

4

2 回答 2

1

所有功劳归功于 Nicolas Repiquet 的答案。

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 中选择一个项目时,它会将其与当前选定的项目进行比较。
如果它们是 Equal 它假定该项目已被选中并且什么都不做。

当您包装它时,您会从 Object 中获得 GetHashCode 和 Equals,并且 object 会给出正确的答案(每个对象都是唯一的)。

于 2012-11-20T19:29:13.777 回答