Почему мой ComboBox SelectedItem нулевой? - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть настройка приложения WPF / MVVM (с использованием MVVM-Light) с ComboBox, который находится внутри DataTemplate.XAML ComboBox выглядит следующим образом:

<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>

Свойство Teachers для 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сбрасывается на ноль, как только я его установил.Я могу пройтись по отладчику и увидеть, что SelectedTeacher имеет значение, и когда я устанавливаю точку останова для установщика для свойства, оно определенно имеет значение.Но затем это свойство снова получает нулевое значение.Я проверил стек вызовов, и он показывал единственную предыдущую строку как Внешний код (что имеет смысл, поскольку я устанавливал это свойство только в одном месте, и оно получалось только один раз, как и ожидалось).Расширение параметра «Внешний код» в окне стека вызовов показывает типичный стек вызовов WPF, возможно, из 40 методов, поэтому он определенно является внутренним для WPF, а не то, что я делаю для его сброса.Фактически, когда я удаляю SelectedItem = "{Binding SelectedTeacher}", установщик для этого свойства не вызывается второй раз (таким образом, он сохраняет свое значение), но, конечно, ComboBox также не показывает выбранный элемент.Я попытался реализовать опцию SelectedIndex в моей модели представления, но это тоже не сработало.ComboBox просто не будет выбирать элемент.Я могу изменить выбранный элемент в ComboBox просто отлично, но первоначальная настройка не займет.

Есть идеи?Исходя из всего, что я искал, это может быть связано со мной с использованием DataTemplate, но я должен это сделать, потому что этот шаблон является частью родительской реализации ContentTemplateSelector.

В качестве примечания, у меня есть несколько свойств, которые связаны сэлементы управления в этом DataTemplate, и это единственный, который не работает.Остальные работают отлично.Я также пытался использовать ComboBox с флагом IsSynchronizedWithCurrentItem и без него, и это не имело никакого значения.

1 Ответ

3 голосов
/ 01 сентября 2011

Вы пытались удалить в EventTrigger вещи и просто использовать

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

с Mode = TwoWay?

мне не ясно, чего вы хотите достичь с помощью EventTrigger?

...