我有一个WPF/MVVM(使用MVVM-Light)应用程序设置与DataTemplate内的组合框。组合框的XAML看起来是这样的:为什么我的ComboBox SelectedItem为空?
<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,它没有区别。
为什么你绑定到SelectedItem和也SelectionChanged? – blindmeis
目标是设置现有值(用户处于编辑模式),然后让他们更改应该选择的值。 SelectionChanged的命令实现只是将SelectedTeacher设置为等于它们所选的值。实际上它非常基本。 – RubyHaus