2011-09-01 192 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