У меня есть настройка приложения 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 и без него, и это не имело никакого значения.