【问题标题】:ComboBox SelectionChanged event firing off unexpectedlyComboBox SelectionChanged 事件意外触发
【发布时间】:2009-12-24 02:59:43
【问题描述】:

我有 4 个水平排列的组合框: 标题仅供参考。

[平台] [发布] [发布项目] [发布项目产品]

我的盒子 UI 模型如下:

  1. 一开始所有四个 ComboBox 都被禁用 (IsEnabled = false)
  2. 页面加载时,异步回调获取平台数据并在启用后将其绑定到平台组合框,并手动将“全部”添加为项目。
  3. 用户选择平台

  4. 如果用户选择“全部”,我会执行以下操作:禁用其他三个组合框 并调用 Async 方法将数据重新绑定到平台组合框。
            releasesFilterComboBox.IsEnabled = false;
            releaseItemsFilterComboBox.IsEnabled = false;
            releaseItemProductsFilterComboBox.IsEnabled = false;
    
            mainClient.GetBuildsAsync(null);
    

  5. 如果用户选择了其他平台(“All”除外),根据选择的平台,我从 DataContext 中的对象中收集与平台匹配的所有项目,并将 Releases 组合框的 ItemsSource 设置为如下:
BuildsListBox.ItemsSource = platformSelectedBI = from bi in buildInfos where 
                                                bi.GetBuildsResult.ReleasePlatform ==  selectedPlatform
                                                 select bi;
releasesFilterComboBox.IsEnabled = true;
List<String> releaseNumbers = ( from bld in buildInfos.Where(bi => bi.GetBuildsResult.ReleasePlatform == selectedPlatform)
select bld.GetBuildsResult.ReleaseNumber ).ToList();

releaseNumbers.Insert(0, "All");
releasesFilterComboBox.ItemsSource = releaseNumbers.Distinct();
  1. 其余的组合框遵循完全相同的过程来绑定数据,并触发 并在触发 SelectionChanged 事件时调用的方法中执行操作。

etc etc -> 其他盒子都一样。

我的问题是:在我至少填充了前两个 ComboBox 之后,当我选择时

PREVIOUS ComboBox 上的“All”选项,在预期行为之后(禁用其他组合框),当我选择“ALL”以外的选项时,会为之前填充的每个 COMBOBOX 触发 SelectionChanged 事件! (所有被禁用的)。 ###

只是澄清一下,如果还没有的话。

我选择了一个平台,因此会填充 Releases。然后我选择了一个 Release,因此 Release Items 被填充。现在,当我在 Platforms 组合框中选择“ALL”时,Release 和 Release Items 框被禁用。然后,当我选择“ALL”以外的平台时,将触发 SelectionChanged 事件,不仅针对 Platforms,还针对 Releases 和 ReleaseItems。 我对事件处理程序第二部分中的组合框所做的唯一更改是像上面显示的代码一样设置项目源。仅此而已。

为什么会为其他组合框触发 SelectionChanged 事件? 这是 SL 组合框中的已知错误吗?我可以防止这种情况发生吗?

如果问题和解释不是很清楚,我很抱歉。如果你问我,我会尽力澄清。

非常感谢!

【问题讨论】:

  • 重新填充列表意味着选择更改,除非所选项目存在于新列表中。我所说的存在是指相同的引用,而不是“相等”的引用。

标签: c# silverlight silverlight-3.0 combobox


【解决方案1】:

这一切都归结为重新填充列表。您可以修复它的一种方法是在您选择“全部”并禁用其他组合框时删除事件处理程序。然后,如果您选择“ALL”以外的其他内容,则可以设置数据源,然后重新添加选择更改事件处理程序。

另一种方法是将它们全部保留在那里,然后在“ALL”选择中将选定的索引设置为 -1(默认),如果它是 -1,则在您的事件处理程序中不做任何事情。

只是一个想法。

【讨论】:

  • 感谢 Joshua,我将尝试这两种方法!
  • 我使用了第二种方法 - 将选定的索引更改为 -1 并仅使用 return 语句处理它们。有用!谢谢
猜你喜欢
  • 2021-03-17
  • 2014-03-26
  • 1970-01-01
  • 2014-05-02
  • 2012-02-03
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多