Я не могу понять поведение combobox.Исходное значение ComboBox SelectedItem не из ItemsSource
У меня есть вид редактирования для редактирования существующих данных заказа. Вот мой VM некоторой части данных Order:
public class OrderDataViewModel : ViewModelBase, IOrderDataViewModel
{
private readonly ICustomersListProviderService _customersListProviderService;
private readonly Order _order;
public OrderDataViewModel(Order order, ICustomersListProviderService customersListProviderService)
{
Assign.IfNotNull(ref _order, order);
Assign.IfNotNull(ref _customersListProviderService, customersListProviderService);
}
public DateTime CreationDate
{
get { return _order.CreationDate ?? (_order.CreationDate = DateTime.Now).Value; }
set
{
if (_order.CreationDate == value) return;
_order.CreationDate = value;
OnPropertyChanged();
}
}
public Customer Customer
{
get { return _order.Customer; }
set
{
if (_order.Customer == value) return;
_order.Customer = value;
OnPropertyChanged();
}
}
private IList<Customer> _customersList;
public IList<Customer> CustomersList
{
get { return _customersList ?? (_customersList = _customersListProviderService.GetAllCustomers().ToList()); }
}
}
И XAML связывание:
<ComboBox Grid.Row="2" Grid.Column="1"
SelectedItem="{Binding OrderDataViewModel.Customer}"
DisplayMemberPath="Name"
ItemsSource="{Binding OrderDataViewModel.CustomersList}"
/>
Описание. Заказ поступает из базы данных репозиторием, _customersListProviderService также получает всех клиентов из базы данных. Я знаю, что, возможно, это может быть сделано лучше, но дело не в этом.
И ... проблема есть. После загрузки окна у моего combobox есть заполненный набор элементов (выпадающий список не пуст), но значение не задано (его пробел). Проверка SelectedItem по результатам кода с нулевым значением. Я много читал и узнал, что вы не можете установить SelectedItem из combobox в элемент, который не находится в ItemsSource.
Хорошо, мой обходной путь, чтобы изменить поглотитель клиентов к:
public Customer Customer
{
get
{ return CustomersList.Single(c => c.Id == _order.Customer.Id); }
set
{
if (_order.Customer == value) return;
_order.Customer = value;
OnPropertyChanged();
}
}
теперь он работает, но это не выглядит хорошо для меня.
Есть ли лучшее решение?
Вы также можете переопределить 'Equals()' и 'GetHashCode()' в своих сущностях и вернуть 'Id.Equals()' и 'Id.GetHashCode()' соответственно –
@HighCore, ваше решение для меня самое лучшее , К сожалению, я не могу отметить это как ответ, так как это комментарий. Не могли бы вы переписать его? – GrzegorzM
Очень приятное обходное решение для ситуаций, когда вам нужно показать значение ComboBox, которое отсутствует в ItemSource: [WPF Customized ComboBox с фантомным значением] (http://www.codearsenal.net/2014/11/wpf-customized-phantom-combobox .html) –