2010-07-02 39 views
0

我看到一个奇怪的问题,当绑定到组合框时显示值有时显示空白。然而,这种情况是可重复的,并在第二次从另一个父表单打开对话时发生。如果父窗体关闭并重新打开,则第一次打开子窗口时,包含的WPF组合框将正确显示显示属性。如果我然后关闭对话框并再次从同一父窗体重新启动它,那么即使我可以验证ViewModel中相同的绑定属性被击中,ComboBox也不会显示任何显示值。奇怪的问题绑定到组合框,其中显示值有时显示为空

<ComboBox ItemsSource="{Binding AvailableVehicles}" 
      SelectedValuePath="Value" 
      SelectedValue="{Binding SelectedVehicle, Mode=TwoWay}" 
      DisplayValuePath="Value.Model" /> 

要解释我的视图模型的数据结构它基本上只是一个公开的AvailableVehicles集里面有一个对象,其类似于可空<>键入它封装了一个Vehicle对象,并公开它通过一个类价值财产。每辆车都有一个模型和成本属性。

我一直在解决这个问题的时间超过一天,我几乎排除了一切,但这是ComboBox本身的错误。所以在这一点上,我希望有一个合理的解决方法,但如果有人能真正帮助指出我的代码中的缺陷,那也会很棒。

注:

  • 我一直没能得到这个问题更简单的单一窗口WPF例如重现。
  • WinForms互操作场景,其中我有一个MDI父窗体和子窗体,其中可能是相关的情况下容纳WPF UserControls。
  • 如果在ItemsSource或SelectedValue绑定上将IsAsync设置为True,则问题不再发生。
  • 如果我把DisplayValuePath改成一个ItemsTemplate,并且在定义的DataTemplate中的绑定中放置了一个转换器,我注意到传入的值是null而不是期望的值。

回答

1

我相信问题必须与绑定到SelectedValue的对象以及被绑定到ItemsSource实际上是相同数据的不同实例,碰巧是没有覆盖Equals或==运算符等的类的实例。从现在我已经经历了几次是因为SelectedValue或者某些情况下SelectedItem在技术上并不等于绑定的ItemsSource中的任何对象,那么它将被忽略,并且您将在UI中显示一个空值。

在这种特殊情况下,问题可能是我在表单关闭时重新使用选定的值,但每次打开对话框时可能都会重新生成锁定列表。

因此,当我在我遇到的任何代码中看到此症状时,我首先要检查的是要绑定的项目类型,并确保SelectedValue或SelectedItem是真正的ReferenceEquals或Equals与ItemsSource中的某个项目。现在我只是再次将这个问题记录在对WPF中合理的绑定错误反馈的支持上。

1

我有同样的问题,只有解决方案,我发现是在我的ViewModel中创建两个属性。一个作为选定的值(值),但它不绑定到ComboBox,而绑定到SelectedItem的绑定(SelectedItem)。在SelectedItem getter中,我返回Values.FirstOrDefault(x => x.Value == Value),在setter中,我通过value.Value设置Value。最后,当Value在OnValueChanged属性中发生变化时,我通知View有关SelectedItem(NotifyPropertyChanged(“SelectedItem”)的更改)...

+0

有趣的是,如果我能够解决它,我会尝试你在测试项目中的建议并回复给你。感谢您的输入。 – jpierson 2011-04-14 20:20:38

+0

我想我找到了我的问题的来源,请参阅我的答案以获取更多信息。 – jpierson 2012-08-24 14:17:58