Зависимые от Silverlight или фильтрующие поля со списком - PullRequest
0 голосов
/ 07 марта 2009

Заранее спасибо за любую помощь. У меня есть два поля со списком, от которых я хотел бы зависеть друг от друга. Например, когда я обновляю один, он фильтрует доступные значения для следующего. Думаю, у меня все работало до тех пор, пока я не переключился между ними несколько раз, оба просто потому, что пусто.

У меня есть два поля со списком стран: FromCountry и ToCountry. Они связаны с ObservableCollection под названием Страны. Я подумал, что имеет смысл использовать событие DroDownOpened, чтобы ограничить значения, доступные в выпадающем списке.

Любые предложения или помощь будет принята с благодарностью.

Метод, который вызывается при нажатии на раскрывающееся меню в стране

private void ToCountry_DropDownOpened(object sender, EventArgs e)
{
            int FromId = (Countries.Country)FromCountry.selectedItem).ID;
            int ToId = (Countries.Country)ToCountry.selectedItem).ID;


  this.ToCountry.ItemsSource = AppInfo.CountryList.Where(p=>p.ID!=FromId).OrderBy(c => c.Name);
}

Метод, который вызывается при нажатии на выпадающий список "Из страны"

private void FromCountry_DropDownOpened(object sender, EventArgs e)
{
            int FromId = (Countries.Country)FromCountry.selectedItem).ID;
            int ToId = (Countries.Country)ToCountry.selectedItem).ID;


  this.FromCountry.ItemsSource = AppInfo.CountryList.Where(p=>p.ID!=ToId).OrderBy(c => c.Name);
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2009

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

1) В свою коллекцию ObservableCollection я добавил два дополнительных свойства: ToSelected и FromSelected.

2) Затем, вместо привязки к комбинированным спискам, я заполнил их каталог через цикл. Не лучший способ сделать это, но, похоже, это был самый прямой путь.

                foreach (Countries.Country currentCnty in CountryList)
                {
                    ComboBoxItem toItem = new ComboBoxItem();
                    toItem.Content = currentCnty;
                    CmboToCountry.Items.Add(toItem);
                    ComboBoxItem fromItem = new ComboBoxItem();
                    fromItem.Content = currentCnty;
                    CmbFromCountry.Items.Add(fromItem);
                }

3) Затем я создал метод UpdateLogic. Это просто перебирает ObservableCollection, устанавливая выбранные записи для комбинированных списков From и To.

4) Затем при изменении выделения для каждого выпадающего списка я добавил следующее, чтобы задать видимость других элементов выпадающего списка. Например, поле со списком «В страну» устанавливает видимость элементов «Из страны» и наоборот.

                //Update the underlying collection with selected items
            UpdateLogic((Countries.Country)CmboToCountry.Content, (Countries.Country)CmboFromCountry.Content);

            for (int iLoop = 0; iLoop < CmboToLocation.Items.Count; iLoop++)
            {
                ComboBoxItem currentItem = CmboToCountry.Items[iLoop] as ComboBoxItem;
                Countries.Country currentCountry = (Countries.Country)currentItem.Content;
                currentItem.Visibility = ((currentCountry.IsFrom) && (currentCountry.ID > 0))
                                            ? Visibility.Collapsed : Visibility.Visible;
            }

Бизнес-требование наличия двух взаимозависимых комбинированных списков было интересной задачей. Надеюсь, это поможет кому-то в будущем. Хотя я уверен, что есть более элегантное решение для выполнения этой задачи.

0 голосов
/ 10 марта 2009

Пытались ли вы иметь два ObservableCollections ToCountries и FromCountries, а затем реагировать на выбранные измененные события для заполнения?

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