我有一个 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 非常相似。 名师当设置另一个属性并且代码看起来与此非常相似时,属性被设置:
this.SelectedTeacher = (from t in this.Teachers where t.Id == this.DataItem.Teacher.Id select t).Single();
我遇到的问题对我来说是零意义,一旦我设置了 SelectedTeacher,它就会被重置为 null。我可以单步调试调试器,看到 SelectedTeacher 有一个值,当我在属性的 setter 上放置断点时,它肯定有这个值。但随后该属性再次被空值击中。我检查了调用堆栈,它显示唯一的前一行是外部代码(这是有道理的,因为我只在一个地方设置了该属性,并且它只被命中一次,正如预期的那样)。在调用堆栈窗口中展开“外部代码”选项会显示典型的 WPF 调用堆栈,其中可能包含 40 个方法,因此它绝对是 WPF 内部的,而不是我正在做的事情来使其重置。事实上,当我删除 SelectedItem="{Binding SelectedTeacher}"时,该属性的 setter 不会被第二次调用(因此它保留了它的值),但当然 ComboBox 也不会显示所选项目。我尝试在我的 View 模型中实现 SelectedIndex 选项,但这也不起作用。 ComboBox 只是不会选择该项目。我可以很好地更改 ComboBox 中的选定项目,但初始设置不会。
有任何想法吗?根据我搜索的所有内容,它可能与我使用 DataTemplate 有关,但我必须这样做,因为该模板是父 ContentTemplateSelector 实现的一部分。
附带说明一下,我有多个属性绑定(bind)到此 DataTemplate 中的控件,这是唯一不起作用的属性。其他工作完美。我也尝试过带有和不带有“IsSynchronizedWithCurrentItem”标志的组合框,它没有任何区别。
最佳答案
你有没有试过删除 EventTrigger 的东西,只是为了使用
SelectedItem="{Binding Path=SelectedTeacher, Mode=TwoWay}"
模式=双向?
我不清楚你想用 EventTrigger 实现什么?
关于wpf - 为什么我的 ComboBox SelectedItem 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266215/