【问题标题】:Mysterious red border appears around ComboBoxComboBox周围出现神秘的红色边框
【发布时间】:2010-11-11 22:22:38
【问题描述】:

我有一个 WPF 应用程序 - 一个 XBAP - 主页上有一个 ComboBox。当我在 ComboBox 中选择一个项目时,事件处理程序会重建一个集合,该集合是列表框的数据源。看起来很简单的东西,我以前在 WPF 中做过的所有东西。

这是从列表中选择一个项目后我的下拉列表的样子:

红色边框到底是从哪里来的?我正在从头开始构建表单,现在没有样式或任何东西。项目中的任何地方甚至都没有提到文本“红色”。它一旦出现就不会消失,它会显示在我放置在控件顶部的任何东西上。

这是标记:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Converter={StaticResource ResourceKey=DeviceInfoNameConverter}}"></TextBlock>
    </DataTemplate>
</ComboBox.ItemTemplate>

更多细节:

  • 这是一个在 IE8 中运行的 XBAP 应用程序
  • 同一页面上的其他下拉控件不这样做
  • 当我尝试使用 Snoop 检查控制树时,边框消失了
  • 转换器不是问题的根源,我已尝试直接绑定到底层对象的属性,但该框仍然出现。

到目前为止,我唯一的猜测是有某种默认错误模板正在应用于控件。我正在使用 WIA,VS 输出窗口中出现了几个 COM 异常,显然与 ListView 的数据绑定有关。控件的数据源是 WIA.DeviceInfo 对象,转换器只是获取下拉文本的名称属性。

【问题讨论】:

标签: wpf xbap


【解决方案1】:

确保您绑定的任何内容都完全符合预期的数据类型。

当我尝试绑定decimal 对象列表但我的 MVVM 属性类型为int 时,出现了这个“神秘的红色框”。检查并仔细检查您所有的 SelectedValueDisplayMemberPathSelectedValuePath 属性(如果您正在使用它们) - 并确保在您打算使用 SelectedItem 时没有使用 SelectedValue

在调试控制台中查找类似这样的绑定错误:

System.NotSupportedException: Int32Converter cannot convert from System.Decimal


System.Windows.Data Error: 7 : ConvertBack cannot convert value '7' (type 'Decimal'). BindingExpression:Path=SharedProductHistoryFilterCriteria.FilterDays; DataItem='PricingManagerViewModel' (HashCode=19425465); target element is 'ComboBox' (Name=''); target property is 'SelectedValue' (type 'Object') NotSupportedException:'System.NotSupportedException: Int32Converter cannot convert from System.Decimal.
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
   at MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

【讨论】:

  • +1 推荐调试控制台;这是确定验证失败原因的最简单方法。
  • 修复错误背后的原因比隐藏指示更好!
  • 我得到的只是抛出异常:System.dll 中的“System.NotSupportedException”异常抛出:PresentationFramework.dll 中的“System.NotSupportedException”
【解决方案2】:

我也有同样的问题,然后我将 SelectedItem 和 ItemsSource 的数据类型都更改为 double 。之前我有 ItemsSource 的 int 列表和 SelectedItem 的 double 列表。它有效。

【讨论】:

    【解决方案3】:

    看起来这只是一个类型转换问题。就我而言, SelectedIndex 绑定到 Enum 类型属性,并且从未调用该属性的设置器。 我只需要在转换器的 Convert 和 ConvertBack 中将返回的值显式转换为正确的类型。

    【讨论】:

      【解决方案4】:

      我有同样的问题。原来是数据不匹配。组合框选定项映射到字符串,选定值映射到字节。一旦我将两者都转换为字符串,它就会按预期工作。

      【讨论】:

        【解决方案5】:

        您的 selectedvalue 不应该是集合的成员,而不是 Folders 集合本身吗?即 Folders.Folder.ID 或类似的东西?

        所以你的 CB itemsSource 将是 Folders 并且 selectedItem 将是 Folder 并且 selectedValue 将是 Name??????

        您需要将 SelectedValue 更新为集合的成员。此外,您需要指定 ItemsSource = {Binding Path=Folders}" t。然后您需要指定 DisplayMemberPath 和 SelectedValuePath。

        我会分别测试每个绑定。首先测试 IsEnabled 的绑定,如果它被选中启用/禁用,则删除项目集合的每个绑定,然后开始测试集合的绑定。

        【讨论】:

          猜你喜欢
          • 2014-01-09
          • 2021-05-05
          • 1970-01-01
          • 1970-01-01
          • 2011-02-19
          • 2011-12-10
          • 1970-01-01
          • 2017-09-25
          • 1970-01-01
          相关资源
          最近更新 更多