Синхронизация двух комбинированных списков, привязанных к одной коллекции и одному и тому же выбранному элементу - PullRequest
0 голосов
/ 25 марта 2019

У меня есть два поля со списком для представления кода клиента и имени клиента.Оба связаны с одной и той же коллекцией объектов и с одним и тем же SelectedItem.Я хочу обновить имя клиента, когда я выбираю код клиента, и наоборот.

Я использую C # с шаблоном MVVM.Я перепробовал все комбинации SelectedItem и SelectedValue с 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, но ничего не происходит.

1 Ответ

0 голосов
/ 25 марта 2019

Вы воссоздаете свою коллекцию каждый раз, когда ссылаетесь на нее, поэтому SelectedItem ссылается на другой объект.По сути, ваши два поля со списком используют разные коллекции в качестве ItemsSources.Измените код на

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