为什么我的ComboBox SelectedItem为null?

时间:2011-09-01 04:46:15

标签: wpf mvvm combobox mvvm-light

我有一个WPF / MVVM(使用MVVM-Light)应用程序设置,其中包含一个位于DataTemplate内的ComboBox。 ComboBox的XAML如下所示:

<ComboBox x:Name="cbTeachers" 
          Grid.Column="1" 
          Style="{StaticResource ComboBox}" 
          ItemsSource="{Binding Teachers}" 
          Grid.Row="3" 
          DisplayMemberPath="Name" 
          SelectedValuePath="Id" 
          IsSynchronizedWithCurrentItem="False" 
          SelectedItem="{Binding Path=SelectedTeacher}">
     <i:Interaction.Triggers>
          <i:EventTrigger EventName="SelectionChanged">
               <i:InvokeCommandAction Command="{Binding TeacherSelectedCommand}"
                                      CommandParameter="{Binding SelectedItem, ElementName=cbTeachers}" />
          </i:EventTrigger>
     </i:Interaction.Triggers>
</ComboBox>

ItemsSource的教师属性是一个名为ObservableRangeCollection的类型,它基于此处的代码:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx,但它与标准的ObservableCollection非常相似。当设置了另一个属性并且代码看起来与此类似时, SelectedTeacher 属性被设置:

this.SelectedTeacher = (from t in this.Teachers where t.Id == this.DataItem.Teacher.Id select t).Single();

我遇到的问题,对我来说没有任何意义,一旦我设置它,SelectedTeacher就会重置为null。我可以单步执行调试器,看看SelectedTeacher有一个值,当我在属性的setter上放置一个断点时,它肯定有值。但随后该属性再次以空值被击中。我检查了调用堆栈,它显示唯一的前一行是外部代码(这是有道理的,因为我只在一个地方设置该属性,它只被命中一次,如预期的那样)。扩展调用堆栈窗口中的外部代码选项显示了可能有40种方法的典型WPF调用堆栈,因此它绝对是WPF内部的,而不是我正在做的重置。实际上,当我删除SelectedItem =“{Binding SelectedTeacher}”时,该属性的setter不会再次被调用(因此它会保留其值),但当然ComboBox也不显示所选项。我尝试在我的viewmodel中实现SelectedIndex选项,但这也不起作用。 ComboBox不会选择该项目。我可以很好地改变ComboBox中的选定项目,但初始设置不会。

有什么想法吗?基于我搜索过的所有内容,它可能与我使用DataTemplate有关,但我必须因为该模板是父ContentTemplateSelector实现的一部分。

作为旁注,我有多个属性绑定到此DataTemplate中的控件,这是唯一不起作用的属性。其他人工作得很好。我也尝试过带有和不带“IsSynchronizedWithCurrentItem”标志的ComboBox,它没有任何区别。

1 个答案:

答案 0 :(得分:3)

你有没有试过删除到EventTrigger的东西而只是使用

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

Mode = TwoWay?

我不清楚你想用EventTrigger实现什么目标?