Дэн Брайант получил большую часть ответа в своем комментарии.
Здесь происходит интернирование строк.Когда вы создаете набор строк с одинаковым значением, .Net экономит использование памяти, поскольку все ссылки на одно и то же строковое значение фактически ссылаются на один и тот же строковый объект.(Подробнее см., Например, this .)
Я действительно не знаю, почему ListBox ведет себя именно так, как в первый раз, когда вы выбираете какой-либо элемент всписок, он выбирает как этот элемент, так и первый элемент в списке.Но он не отменяет выбор, когда вы нажимаете на новый элемент, потому что проверяет, отличается ли SelectedItem
от элемента, на который вы только что щелкнули, и это не так.
Я получил точно такое же поведение, привязав ListBox к коллекции тестовых объектов:
public class TestObject
{
public override string ToString()
{
return GetHashCode().ToString();
}
}
В MainWindow.xaml
:
<ListBox x:Name="MyListBox" ItemsSource={Binding}"/>
В MainWindow.xaml.cs
:
ObservableCollection<TestObject> test = new ObservableCollection<TestObject>();
TestObject t = new TestObject();
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
test.Add(t);
MyListBox.DataContext = test;