Проблема полностью вызвана строкой Tables.Clear()
в вашем методе aaaa()
. Поскольку Tables
является наблюдаемой коллекцией, стирание всего содержимого коллекции приводит к тому, что WPF обновляет отображение новым пустым списком. Затем он пытается выбрать текущий активный элемент, используя SelectedIndex
, который не существует (потому что список теперь пуст). В результате для механизма привязки остается значение, которое не может быть применено, и он решает деактивировать и отключить логику привязки:
System.Windows.Data Warning: Got PropertyChanged event from Window1 for TheIndex
System.Windows.Data Warning: GetValue at level 0 from Window1 using DependencyProperty(TheIndex): '1'
System.Windows.Data Warning: TransferValue - got raw value '1'
System.Windows.Data Warning: TransferValue - using final value '1'
System.Windows.Data Warning: Deactivate
System.Windows.Data Warning: Replace item at level 0 with {NullDataItem}
System.Windows.Data Warning: Detach
К тому времени, когда он достигает "TheIndex = j;" линия, привязка больше не активна и не видит изменения в TheIndex, что означает, что желаемый индекс больше не выбран.
Существует несколько способов решения этой проблемы:
- Не выбрасывать всю коллекцию каждый раз. Без очистки коллекции у логики привязки данных всегда есть индекс для выбора, что означает, что он никогда не отсоединяется.
- Использовать
TwoWay
привязку. Это работает, потому что теперь ComboBox участвует в привязке; Вы очищаете Tables
, привязка пытается установить, но не может найти индекс, поэтому ComboBox сбрасывается в специальную позицию без индекса -1, которая затем записывает обратно в TheIndex
(двусторонняя часть), это допустимое значение, поэтому логика привязки не отсоединяется.
Не выбирать индекс (-1) перед очисткой коллекции. Если при очистке Tables
не выбран индекс (-1), ComboBox не пытается применить SelectedItem
, что означает, что он не "видит" коллекцию, опустошенную и повторно заполненную, и, следовательно, не отделяется.
private void aaaa(object sender, RoutedEventArgs e)
{
TheIndex = -1;
j = (j + 1)%10;
Tables.Clear();
for (int i = 0; i < 10; i++)
{
Tables.Add(i.ToString());
}
TheIndex = j;
}
Из соображений производительности, архитектуры и ясности я настоятельно рекомендую вариант 1, хотя я понимаю, что ваш реальный сценарий может быть более сложным и требовать что-то вроде 3.
Sidenote:
Выявить причину таких проблем связывания достаточно просто при использовании трассировок привязки, подобных приведенной выше. Включите их для единой привязки, объявив пространство имен System.Diagnostics и добавив PresentationTraceSources.TraceLevel=High
к привязке, которая вызывает проблемы:
<Window xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" />
...
<TextBlock Text="{Binding Path=x, diag:PresentationTraceSources.TraceLevel=High}" />
Больше способов отладки привязок WPF здесь .