我有一個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