同步绑定到同一集合和同一选定项目的两个组合框

Synchronizing two comboboxes bound to the same collection and to the same selected item

我有两个组合框来表示客户代码和客户名称。两者都绑定到相同的对象集合和相同的 SelectedItem。我想在 select 客户代码时更新客户名称,反之亦然。

我正在使用 C# 和 MVVM 模式。我已经尝试了 SelectedItemSelectedValue 与 selectedvaluepath 的所有组合,但似乎没有任何效果。

这是我的两个组合框:

<ComboBox Name="CmbStockUnitCustomerCode" ItemsSource="{Binding CustomerCodeDtos}" 
          DisplayMemberPath="Code" SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}" 
          IsSynchronizedWithCurrentItem="True"></ComboBox>

<ComboBox Name="CmbStockUnitCustomerName" ItemsSource="{Binding CustomerCodeDtos}"
          DisplayMemberPath="Name" SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}" 
          IsSynchronizedWithCurrentItem="True"></ComboBox>

这些是绑定对象:

public CustomerDto SelectedCustomer
{
    get => _selectedcustomer;
    set
    {
        _selectedcustomer = value;
        RaisePropertyChanged("SelectedCustomer");
    }
}

public class CustomerDto
{
    public short Code { get; set; }
    public string Name { get; set; }

    public CustomerDto(short code, string name)
    {
        this.Code = code;
        this.Name = name;
    }
}
public ObservableCollection<CustomerDto> CustomerCodeDtos
{
    get => _databaseService.GetAllCustomers();
}              

当我更新其中一个组合框时,我希望另一个组合框更新为对象 CustomerDto 中的相应值,但没有任何反应。

您每次引用集合时都在重新创建集合,因此 SelectedItem 引用了不同的对象。实际上,您的两个组合框使用不同的集合作为 ItemsSources。将代码更改为

public ObservableCollection<CustomerDto> CustomerCodeDtos
{
    get 
    { 
       if(_customerCodes==null)
       {
          _customerCodes = _databaseService.GetAllCustomers();
       }
       return _customerCodes;
    }
}