По умолчанию WPF сравнивает SelectedItem
по ссылке, а не по значению. Это означает, что если SelectedItem
не является тем же объектом в памяти, что и элемент в вашем ItemsSource
, то сравнение вернет false и элемент не будет выбран.
Например, это, вероятно, не будет работать
MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = DAL.GetUser(1);
однако это будет:
MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = MyCollection.FirstOrDefault(p => p.Id == 1);
Это потому, что во втором примере SelectedUser устанавливает элемент, который фактически существует в MyCollection
, тогда как в первом примере это может быть не так. Даже если данные одинаковы, они ссылаются на разные объекты в памяти.
Если выбранный вами элемент не ссылается на тот же элемент в памяти, что и ваш элемент ItemsSource, то либо используйте SelectedValue
и SelectedValuePath
, чтобы связать выбранный по умолчанию выбор вашего ComboBox, либо перезапишите метод .Equals()
вашего класса для возврата Значение true, если данные в сравниваемых объектах совпадают.
public override bool Equals(object obj)
{
if (obj == null || !(obj == MyClass))
return false;
return ((MyClass)obj).Id == this.Id);
}