Я боролся с этой проблемой около недели и до сих пор не знаю, что вызвало такое странное поведение комбобокса.
После повышения OnPropertyChanged против ItemsSource комбобокса ( @ Jeronimo the Black case), классический элемент управления combobox не может распознать, что SelectedItem все еще находится в базовой коллекции.Затем внутренние элементы управления устанавливают SelectedItem = NULL и пользовательский интерфейс отображается пустым.Ошибка состоит в том, что такое поведение, воспроизводимое на 50%, после переключения на другой объект или модель, может привести к самовосстановлению взаимосвязи между ItemsSource и SelectedItem.
В моем случае даже фильтрация ItemsSource вызвала эти ошибки.Обратите внимание, что свойство ParentRegionId имеет тип Nullable.
eg.1 без пробелов
public IEnumerable CityDisplayList
{
get
{
if (_selectedCity != null && _selectedCity.ParentRegionId != null)
{
return ItemsSource.Where(x => x.ParentRegionId != null);
}
return Enumerable.Empty<TRegion>();
}
}
например.2 пробелы 50% (дополнительная фильтрация)
public IEnumerable CityDisplayList
{
get
{
if (_selectedCity != null && _selectedCity.ParentRegionId != null)
{
return ItemsSource.Where(x => x.ParentRegionId != null && x.ParentRegionId == _selectedCity.ParentRegionId);
}
return Enumerable.Empty<TRegion>();
}
}
например.3 50% пробелов (IsAsync = True в операторе связывания)
ItemsSource="{Binding CityDisplayList, Mode=OneWay, IsAsync=True}"
Я поддерживаю идею @ jpierson , что лучше вообще не использовать SelectedItem, если ваша базовая коллекция и SelectedItem былисозданы в разных экземплярах классов или когда они имеют разные источники данных.Например, я использовал свойство зависимости, чтобы передать SelectedItem в UserControl.Однако ItemsSource был частью другого контекста UC.
Самый простой способ решить эту проблему - просто забыть о свойстве SelectedItem:
<ComboBox x:Name="cbxCity" ItemsSource="{Binding CityDisplayList}" DisplayMemberPath="RegionName"
SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctrl:ControlRegionCombobox}}, Path=SelectedCity}" />
и использовать «SelectedValue» + «SelectedValuePath»вместо:
<ComboBox x:Name="cbxCity" ItemsSource="{Binding CityDisplayList}" DisplayMemberPath="RegionName"
SelectedValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctrl:ControlRegionCombobox}}, Path=SelectedCity.Id}"
SelectedValuePath="Id" />