wpf - ComboBox SelectedItem 初始值不是来自 ItemsSource

标签 wpf mvvm binding combobox selecteditem

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

我有一个编辑 View 来编辑现有的订单数据。这是我的部分订单数据的虚拟机:

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 绑定(bind):
 <ComboBox Grid.Row="2" Grid.Column="1"
                        SelectedItem="{Binding OrderDataViewModel.Customer}"
                        DisplayMemberPath="Name"
                        ItemsSource="{Binding OrderDataViewModel.CustomersList}"
                        />

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

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

好的,我的解决方法是将客户 setter/getter 更改为:
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()在您的实体和 return Id.Equals()Id.GetHashCode()分别

关于wpf - ComboBox SelectedItem 初始值不是来自 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19032061/

相关文章:

android - 构造函数中的默认值显示Kotlin中的错误

java - 如何将复选框绑定(bind)到 Play 中的 boolean 值!框架

wpf - 如何将Win32窗口设置为WPF窗口的所有者?

c# - WPF - 在 Graph 的边上添加标签#

c# - 在父 View 模型中公开 subview 模型的属性

JavaFx:将列表中元素的索引绑定(bind)到元素的属性

wpf - MVVM DataTemplate 绑定(bind)问题

c# - 未定义的枚举 & WPF ComboBox & WCF 序列化

wpf 文本框工具提示绑定(bind)自身值

c# - 将单独的列表绑定(bind)到一个列表框中