Привязать элементы поля со списком к выбранному элементу другого поля со списком

#.net #silverlight #caliburn.micro

#.net #silverlight #caliburn.micro

Вопрос:

У меня есть два поля со списком. Первый из них, Companys, содержит коллекцию объектов Company. У каждого объекта есть строковое имя и коллекция строк:

Вот класс:

 public class clsCompany : PropertyChangedBase
{
    public string Name { get; set; }
    public BindableCollection<string> Regions;
    public override string ToString()
    {
        return Name;
    }
}
  

Вот код. Текстовое поле обновляется просто отлично, когда я выбираю элемент. Но выпадающее окно, которое должно отображать регионы, не:

 <ComboBox x:Name="Companys" DisplayMemberPath="Name" Width="100"/>
<ComboBox  x:Name="SelectedCompany_Regions" Width="100"/>
<TextBlock x:Name="SelectedCompany_Name" Width="100" />
  

Единственный способ, которым я могу заставить работать 2-й выпадающий список, — это создать новое свойство в моей ViewModel, которое связано с SelectedCompany.Регионы Но почему то, что у меня не работает?

Ответ №1:

Ваша проблема вызвана отсутствием уведомлений об изменении свойств. При обновлении компании вам также необходимо вызвать уведомление об изменении свойств для регионов этой компании, чтобы регионы ComboBox знали, что их источник также обновился. Вы можете добиться этого, изменив свойства Companies и SelectedCompany на следующие:

 public BindableCollection<Company> Companys { get; set; }
private Company _selectedCompany;
public Company SelectedCompany
{
    get { return _selectedCompany; }
    set
    {
        _selectedCompany = value;
        NotifyOfPropertyChange(() => SelectedCompany);
        NotifyOfPropertyChange(() => SelectedCompany.Regions);
    }
}
  

Комментарии:

1. Я сделал именно это, но до сих пор не обновил выпадающий список SelectedCompany_Regions.

2. @Daniel Хммммм … вот пример приложения, которое работает в этой ситуации, насколько я понимаю … docs.google.com /…

3. Спасибо — мои регионы были полем, а не свойством, в классе Company. В этом и заключалась проблема.

4. ах да, ViewModelBinder выполняет поиск только по свойствам

Ответ №2:

Если вы создадите Companys в виде CollectionView, тогда вы сможете привязать вторую комбинацию к Companys.Текущий элемент.Регионы.

Комментарии:

1. Пожалуйста, объясните, как это отвечает на вопрос. Может быть полезен пример кода.

2. Companys — это BindableCollection — что такое CollectionView?