Wpf 为什么我的组合框SelectedItem为空?

Wpf 为什么我的组合框SelectedItem为空?,wpf,mvvm,combobox,mvvm-light,Wpf,Mvvm,Combobox,Mvvm Light,我有一个WPF/MVVM(使用MVVM Light)应用程序设置,其中有一个数据模板内的组合框。组合框的XAML如下所示: <ComboBox x:Name="cbTeachers" Grid.Column="1" Style="{StaticResource ComboBox}" ItemsSource="{Binding Teachers}" Grid.Row="3" Disp

我有一个WPF/MVVM(使用MVVM Light)应用程序设置,其中有一个数据模板内的组合框。组合框的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>
我遇到的问题,对我来说毫无意义,是选择了教师,一旦我设置了它,就会将其重置为null。我可以单步通过调试器,看到SelectedTeacher有一个值,当我为属性设置断点时,它肯定有这个值。但随后该属性再次被一个空值击中。我检查了调用堆栈,它显示唯一的前一行是外部代码(这是有意义的,因为我只在一个地方设置了该属性,并且它只被命中一次,正如预期的那样)。在call stack窗口中展开External Code(外部代码)选项将显示可能包含40个方法的典型WPF调用堆栈,因此它肯定是WPF内部的,而不是我正在进行的重置。事实上,当我删除SelectedItem=“{Binding SelectedTeacher}”时,该属性的setter不会再次被调用(因此它会保留其值),但当然,组合框也不会显示所选项目。我尝试在viewmodel中实现SelectedIndex选项,但也不起作用。组合框不会选择该项。我可以在组合框中很好地更改所选项目,但初始设置不需要

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


作为旁注,我有多个属性绑定到此DataTemplate中的控件,这是唯一一个不起作用的属性。其他的都很好。我还尝试了带有和不带“IsSynchronizedWithCurrentItem”标志的组合框,但没有任何区别。

您是否尝试删除到EventTrigger的内容并仅使用它

SelectedItem="{Binding Path=SelectedTeacher, Mode=TwoWay}"
模式=双向


我不清楚您想用EventTrigger实现什么?

您是否尝试过删除到EventTrigger的内容并只是为了使用它

SelectedItem="{Binding Path=SelectedTeacher, Mode=TwoWay}"
模式=双向


我不清楚您想用EventTrigger实现什么?

为什么绑定到SelectedItem和SelectionChanged?目标是设置现有值(用户处于编辑模式),然后让他们在选择时更改值。SelectionChanged的命令实现只是将SelectedTeacher设置为其所选的值。实际上这很基本。为什么要绑定到SelectedItem和SelectionChanged?目标是设置现有值(用户处于编辑模式),然后让他们在选择时更改值。SelectionChanged的命令实现只是将SelectedTeacher设置为其所选的值。事实上这是非常基本的。我试过了,但它仍然第二次用空值设置SelectedTeacher属性。这背后的目标是设置初始选定值(因为他们正在编辑现有项),然后如果他们决定更改该值,则使用SelectionChanged更新SelectedTeacher值。明白了!我从组合框中删除了该命令,并在组合框声明的末尾更改了一些其他内容,因此它看起来是这样的:DisplayMemberPath=“Name”IsSynchronizedWithCurrentItem=“True”SelectedValue=“{Binding Path=SelectedTeacher,Mode=TwoWay}”。它看起来像是删除命令、更改为SelectedValue(而不是项)和删除SelectedValuePath选项的组合解决了这个问题。谢谢你给我指引了正确的方向!好吧,我几乎已经有了上面的结果,但结果是它被选择了一个值,但不是正确的值。当我将“IsSynchronizedWithCurrentItem”设置为false时,它开始按预期工作。WPF有时确实会让事情变得混乱。未来还有别人!我尝试了这个,但它仍然第二次使用空值设置SelectedTeacher属性。这背后的目标是设置初始选定值(因为他们正在编辑现有项),然后如果他们决定更改该值,则使用SelectionChanged更新SelectedTeacher值。明白了!我从组合框中删除了该命令,并在组合框声明的末尾更改了一些其他内容,因此它看起来是这样的:DisplayMemberPath=“Name”IsSynchronizedWithCurrentItem=“True”SelectedValue=“{Binding Path=SelectedTeacher,Mode=TwoWay}”。它看起来像是删除命令、更改为SelectedValue(而不是项)和删除SelectedValuePath选项的组合解决了这个问题。谢谢你给我指引了正确的方向!好吧,我几乎已经有了上面的结果,但结果是它被选择了一个值,但不是正确的值。当我将“IsSynchronizedWithCurrentItem”设置为false时,它开始按预期工作。WPF有时确实会让事情变得混乱。未来还有别人!