ComboBox SelectedItem 初始值不是来自 ItemsSource

Grz*_*rzM 0 wpf binding combobox selecteditem mvvm

我无法理解组合框的行为。

我有一个编辑视图来编辑现有的订单数据。这是我的部分订单数据的 VM:

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()); }
    }
}
Run Code Online (Sandbox Code Playgroud)

和 XAML 绑定:

 <ComboBox Grid.Row="2" Grid.Column="1"
                        SelectedItem="{Binding OrderDataViewModel.Customer}"
                        DisplayMemberPath="Name"
                        ItemsSource="{Binding OrderDataViewModel.CustomersList}"
                        />
Run Code Online (Sandbox Code Playgroud)

描述。订单来自 Repository 的数据库,_customersListProviderService 也从数据库中获取所有客户。我知道也许它可以做得更好,但这不是问题的重点。

而且……问题是。加载窗口后,我的组合框填充了项目集合(下拉列表不为空)但未设置值(为空)。通过带有 null 的代码隐藏结果​​检查 SelectedItem。我读了很多,发现你不能将组合框的 SelectedItem 设置为不在 ItemsSource 中的项目。

好的,我的解决方法是将 Customer getter 更改为:

public Customer Customer
        {
            get
            { return CustomersList.Single(c => c.Id == _order.Customer.Id); }
            set
            {
                if (_order.Customer == value) return;

                _order.Customer = value;
                OnPropertyChanged();
            }
        } 
Run Code Online (Sandbox Code Playgroud)

现在它有效,但对我来说看起来不太好。

有没有更好的解决办法?

Fed*_*gui 5

您可以覆盖Equals()GetHashCode()在实体return Id.Equals()Id.GetHashCode()分别