WPF - Combobox选定项未设置?

13

我有一个 ComboBox,它的 ItemsSource 绑定到一个静态的 List<CustomSettings> 选项列表。ComboBox 是一个表单的一部分,这个表单绑定到一个 CustomObject 类,其中一个属性是 CustomSettingProperty。

我想将 ComboBox 的 SelectedItem 绑定到 CustomObject 中指定的属性,但是 SelectedItem="{Binding Path=CustomSettingProperty}" 没有设置默认的选中项。使用断点调试我发现它正在调用 get; 方法,所以我认为问题可能在于 CustomSettingProperty 是单独创建的,而不是与 List<CustomObject> 相同的项目。

有没有简单的方法来解决这个问题?或者有没有其他替代方案?因为 CustomSettings 类包含一个 Id,也许可以用它来实现?


你能提供CustomSettingProperty的代码吗?并可能给出一个设置它的示例? - jsmith
2个回答

27

如果所选项目与列表中包含的实例不同,则必须在CustomObject中重写Equals()方法,以让ComboBox知道它是同一个对象。

如果是同一实例,可能只需要简单地将BindingMode设置为TwoWay:

SelectedItem="{Binding Path=CustomSettingProperty,Mode=TwoWay}"

2
谢谢!我简直不敢相信我没想到覆盖重写 Equals......我希望自己不会再犯这个错误。 - Rachel
我有同样的问题,但我已经重写了 Equals() 方法。如何设置 BindingMode?注意:我正在使用 c# 和 Winforms。 - Cristhian Boujon
默认情况下,模式是双向的,不是吗? - Brock Hensley
从MSDN>编程方式确定依赖属性默认是单向绑定还是双向绑定的方法是使用GetMetadata获取属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。 - Maxence
谢谢@Heinz K,但如何覆盖Equals()?你能给个小例子吗? - LightTechnician
1
在我的情况下,仅仅覆盖Object.Equals就会引发StackOverflowException异常。我认为整个答案是要实现完整的IEquatable<T>,这意味着要实现它的Equals方法并且覆盖Object.Equals(Object)和Object.GetHashCode()方法,就像这个例子中所示(请参见“备注”部分的结尾,即“实现说明”和“示例”部分)。 - Alex34758

0

我找到了解决方法,原来是 Prism 的事件聚合器传递的是引用类型,导致 UI 线程停止处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接