Silverlight依赖或过滤组合框

时间:2009-03-07 20:37:04

标签: silverlight combobox

提前感谢您的帮助。我有两个组合框,我想依赖于彼此的输入。例如,当我更新一个时,它会过滤下一个的可用值。以为我把一切都搞定了,直到我在两者之间切换了几次,都只是因为空白。

我有两个国家组合框,FromCountry和ToCountry。这些绑定到名为Countries的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 :(得分:0)

您是否尝试过两个ObservableCollections ToCountries和FromCountries,然后对选择更改的事件做出反应以填充?

答案 1 :(得分:0)

经过一些实验,我设法找到了一个有效的解决方案。下面允许我有两个组合框依赖于相同的数据源,以及彼此。我确信优雅的方法,但这似乎有效。

1)在我的ObservableCollection上,我添加了两个额外的属性,ToSelected和FromSelected。

2)然后我没有绑定到Comboboxes,而是通过循环填充它们的目录。这不是最好的方法,但它似乎是最直接的。

                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)然后在每个组合框的选择更改时,我添加了以下内容以设置其他组合框项目的可见性。例如,To Country组合框将设置From Country项目的可见性,反之亦然。

                //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;
            }

拥有两个相互依赖的组合框的业务需求是一个有趣的挑战。希望这可以帮助将来的某个人。虽然我确信有更优雅的解决方案来执行此任务。