WPF полу каскадный список - PullRequest
       1

WPF полу каскадный список

1 голос
/ 31 октября 2010

У меня есть 3 элемента управления на моей странице

  • ListBox A
  • ListBox B
  • ComboBox C

ListBox A привязан к даннымк коллекции предметов A

ComboBox C связан с коллекцией предметов C

ListBox B связан с коллекцией предметов B

B имеет ссылку на ItemA и Item C, ListBox B должен показывать только те элементы, где Item A - выбранный элемент ListBox A, а Item C - выбранный элемент ListBox C

. Я немного испортил представления коллекций как ItemSource.в ListBox B, устанавливая фильтр, но я могу получить его только для обновления содержимого ListBox B на основе ListBox A или ComboBox C, а не их обоих одновременно.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

В вашей модели представления задайте для CollectionView предикат фильтра, что-то вроде этого:

Items = CollectionViewSource.GetDefaultView(_Items) as CollectionView;
Items.Filter = (x => ((Item)x).CategoryA == SelectedCategoryA 
                && ((Item)x).CategoryC == SelectedCategoryC);

Свяжите списки / поля со списком свойств SelectedItem с SelectedCategoryA и SelectedCategoryC. В установщиках для этих свойств вызовите Items.Refresh().

Редактировать

В поле со списком свяжите ItemsSource и SelectedItem, например

<ListBox ItemsSource="{Binding CategoryListA}"
         SelectedItem="{Binding SelectedCategoryA, Mode=TwoWay}"/>

В вашей модели представления создайте свойство, подобное этому:

private Category _SelectedCategoryA;

public Category SelectedCategoryA
{
   get { return _SelectedCategoryA; }
   set
   {
      if (value != _SelectedCategoryA)
      {
         _SelectedCategoryA = value;
         Items.Refresh();
      }
   }
}
0 голосов
/ 01 ноября 2010

Одним из решений было бы создание отдельной коллекции элемента B из коллекции свойств открытого средства доступа типа b. как это.

private List<B> m_trueCollection; //the actual collection of B
public ObservableCollection<B> FilteredB { get; set; } //bind to this

Затем прослушивайте каждый раз, когда есть изменения в выбранном элементе ComboBox C или Listbox A., используя свойство SelectionChanged Event.

Если выбор был изменен, выполните итерацию истинной коллекции и перестройте FilteredB в соответствии с вашими критериями.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...