“类型为FixedToolBar的值不能添加到'UIElementCollection'类型的集合或字典中”,但FixedToolBar是UIElement的子类

时间:2015-09-14 16:28:47

标签: wpf xaml controls visual-studio-2015 uielement

我们在类库中定义了一个名为FixedToolBar的自定义控件,该库由第二个程序集引用,该程序集通过XAML使用它。但是,VS2015显示错误:

  

类型为FixedToolBar的值无法添加到“UIElementCollection”类型的集合或字典中

这是班级本身

public class FixedToolBar : Control // <-- Control is a subclass of UIElement
{
    // Bla bla
}

...这里是XAML片段......

<DockPanel>

    <c:FixedToolBar x:Name="MainToolBar" DockPanel.Dock="Top">
        <Button Header="Test 1" />
        <Button Header="Test 2" />
    </c:FixedToolBar>

    <ListBox x:Name="MainListBox" />

</DockPanel>

更奇怪的是它只显示XAML编辑器打开时的错误,但是否则编译并运行得很好!

任何想法为什么?让VS在设计时报告所有这些错误真的很烦人。所有那些红色的波浪形使得XAML da @ n几乎不可读!

1 个答案:

答案 0 :(得分:0)

有传言说,这些幻影错误曲线通常出现在以下情况下:

  • 您的xaml在项目A中。
  • 项目A在其引用中包括项目B。
  • 要添加到集合中的元素的类型在项目B中定义。
  • 元素的类型取决于项目C中的某些类型。
  • 项目A在其引用中未明确包含项目C。 (因为不是必须的。)

就构建系统而言,这根本不是问题,因为项目A的依赖项是递归计算的,因此它们包括依赖项的依赖项,因此当然会包含项目C。

但是显然,由于某些不可思议的原因,xaml子系统本身需要解决项目依赖关系,并且不够智能地递归解决它们。

解决方案是使项目A明确引用项目C,尽管事实上它没有使用它。

还请注意以下事实:尝试这样做可能会遇到进一步的麻烦,例如,如果您编辑A.csproj以向项目B添加PackageReference并重新加载项目A,则该引用可能不会出现在“参考”,在这种情况下幻像的花体不会消失。适当的完全干净的重建通常可以解决此问题。