0

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

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

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 也从数据库中获取所有客户。我知道也许它可以做得更好,但这不是问题的重点。

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

好的,我的解决方法是将客户吸气剂更改为:

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

                _order.Customer = value;
                OnPropertyChanged();
            }
        } 

现在它可以工作了,但对我来说看起来不太好。

有没有更好的解决方案?

4

5 回答 5

5

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

于 2013-10-14T21:39:05.397 回答
2

我刚刚在UWP 应用程序中遇到了类似的问题。我绑定到一个字符串数组。

<ComboBox SelectedItem="{Binding Carrier, Mode=TwoWay}" ItemsSource="{Binding Carriers}" />

当我将 ItemsSource 更改为 SelectedItem 之前时,问题解决了:

<ComboBox ItemsSource="{Binding Carriers}" SelectedItem="{Binding Carrier, Mode=TwoWay}" />

以防万一有人有类似的问题。

于 2017-02-26T17:18:09.860 回答
0

我希望这会奏效:

检查Customer, 是否已经绑定到另一个控件。如果是这样,请删除所有其他涉及Customer.

我遇到了同样的问题,即IsCheckedCheckBox 的属性也绑定到 viewModel 但使用转换器检查它是否为空。我将其绑定更改为布尔值,问题不再存在。

于 2013-10-05T08:54:46.190 回答
0

也许像下面这样将 SelectedValuePath="Name" 添加到您的 xaml 会有所帮助

 <ComboBox Grid.Row="2" Grid.Column="1"
                    SelectedItem="{Binding OrderDataViewModel.Customer}"
                    DisplayMemberPath="Name"
                    ItemsSource="{Binding OrderDataViewModel.CustomersList}"
                    SelectedValuePath="Name"
                    />
于 2013-09-26T15:48:12.580 回答
0

使用您需要的两组数据创建一个 ViewModel,即设置为填充 ComboBox 和 Record。为方便起见,我将使用客户和年份。

class CustomerDetailsViewModel
{
    public CustomertModel CutomerModel { get; set; }
    public YearListModel YearList { get; set; }

    public CustomerDetailsViewModel(CustomerModel _CustomerModel)
    {
        CustomerModel = _CustomerModel;
        YearList = new YearListModel();
    }
}

因此,我在组合框中填写了年份列表,并获得了我选择的客户记录。

<ComboBox x:Name="cbCustomerDetailsYear" Margin="128,503,0,0" 
                      DataContext="{Binding DataContext,
                                    ElementName=CustomerDetailsPage}"
                      ItemsSource="{Binding YearList.Years, Mode=OneWay}"
                      DisplayMemberPath="Description"
                      SelectedValue="{Binding CustomerModel.YearID}"
                      SelectedValuePath="id" />

视图模型被分配给页面数据上下文,我将它绑定到组合框。

组合框填充了 Itemsource 和 Displaymember 以及来自我的 Viewmodel 的 Year 模型列表。描述只是一个字符串,表示 1999、2000 或其他

SelectedValue 也与 ViewModel 中的 Customer 记录中的 Year 外键绑定。SelectedValuePath 是将 2 结合在一起的神奇成分。所以 id 代表年份的 id 但会绑定到客户 YearID 字段并由 Combobox id 值设置。

希望这很清楚?!?!?!

于 2013-09-26T22:11:50.400 回答