2011-09-01 189 views
0

我有一个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,它没有区别。

+0

为什么你绑定到SelectedItem和也SelectionChanged? – blindmeis

+0

目标是设置现有值(用户处于编辑模式),然后让他们更改应该选择的值。 SelectionChanged的命令实现只是将SelectedTeacher设置为等于它们所选的值。实际上它非常基本。 – RubyHaus

回答

3

你试图消除对EventTrigger的东西,只是使用

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

与模式=双向?

其对我不清楚你想用你的EventTrigger实现什么?

+0

我试过这个,它仍然用一个空值第二次设置SelectedTeacher属性。其目标是设置初始选定值(因为它们正在编辑现有项目),然后使用SelectionChanged更新SelectedTeacher值(如果它们决定更改该值)。 – RubyHaus

+0

Got it!我从ComboBox中移除了命令,并在ComboBox的声明结束时更改了其他一些内容,所以它看起来像这样:DisplayMemberPath =“Name”IsSynchronizedWithCurrentItem =“True”SelectedValue =“{Binding Path = SelectedTeacher,Mode = TwoWay} ”。它看起来像是删除命令,更改为SelectedValue(不是Item)和删除SelectedValuePath选项的组合。感谢您带领我走向正确的方向! – RubyHaus

+0

好吧,我几乎把它与上述,但事实证明它被选定* a *值,但不是正确的。当我将“IsSynchronizedWithCurrentItem”设置为false时,它开始按预期工作。 WPF确实有时会让事情变得混乱。 HTH未来的其他人! – RubyHaus