无法将指定的值分配给集合

时间:2014-10-28 10:43:21

标签: c# wpf xaml

修改

这让我困扰了将近一年。我会更新答案并添加赏金。

我是自定义控件,具有依赖属性

public class Graph : Control
{
    public List<Figure> Figures
    {
        get { return (List<Figure>)GetValue(FiguresProperty); }
        set { SetValue(FiguresProperty, value); }
    }
    public static readonly DependencyProperty FiguresProperty =
        DependencyProperty.Register("Figures", typeof(List<Figure>), typeof(Graph),
        new PropertyMetadata((d, e) => ((Graph)d).InvalidateVisual()));
    ...
}

Figure是所有数字的基类:

public abstract class Figure { ... }

public class LineFigure : Figure { ... }
public class XGridFigure : Figure { ... }
public class YGridFigure : Figure { ... }
...

现在看看下面的截图来看问题:有时候(在其他地方对xaml进行更改之后)设计师为此疯狂并停止渲染整个窗口,抛出异常,代码编译并运行时没有问题即可。我可以关闭这个xaml(设计师)并再次打开它以使问题消失。但它总是重新出现。

问题:我身边有什么问题吗?缺少属性?错误的用法?我该如何解决这个问题?


旧问题

丑陋的情况。

我有2 UserControl。在两个手工制作的控件Graph中都使用了。 Graph具有属性Figures以指定List<Figure>。有数十个数字以Figure为基础。

在一个UserControl中它可以正常工作,在其他抛出异常中

  

无法将指定的值分配给集合。预计会出现以下类型:&#34;图&#34;。

我没有看到可能导致问题的区别。


这是一个有问题的截图


这里有一个

尽管项目编译和运行存在错误,但如果我需要对有问题的UserControl进行修改,那么它就不会显示任何内容(说&#34;标记无效&#34;)。图表几乎相同,所有8错误仅显示一个UserControl

我该怎么办?如何解决此类错误?我({完全)排除了(完全)Graph的任何问题,因为它运行没有一个问题并且它对另一个UserControl没有问题。 Visual Studio设计师的问题?使用2013 Express for Windows Desktop。

3 个答案:

答案 0 :(得分:2)

关闭项目,重新启动VS并重新打开它。它还列出错误吗?视觉工作室似乎经常报告“幻影错误”,但如果你关闭并重新启动等,它们通常会消失。

答案 1 :(得分:2)

如果自定义控件位于同一个解决方案或项目中,Visual Studio会构建它(当它认为有必要时),以便它可以使用设计器中的控件。

有时这个构建/缓存的版本与代码文件不同步,导致Xaml解析器/语法检查器混淆并显示那些波浪形的红线。

我已经成功关闭并重新打开所有使用该控件的设计人员,但这仍然非常烦人。根据我的经验,最可靠的解决方案是将控制转移到一个单独的解决方案和项目中,并设置一个适当的解决方案。参考dll。

答案 2 :(得分:2)

确实,视觉设计师无法识别Figure的继承。一种解决方案是使用IList作为接口类型:

    public IList Figures
    {
        get
        {
            return (IList)GetValue (FiguresProperty);
        }
        set
        {
            SetValue (FiguresProperty, value);
        }
    }

    public static readonly DependencyProperty FiguresProperty =
        DependencyProperty.Register ("Figures", typeof (IList), typeof (Graph), new PropertyMetadata (new List<object>()));

这可能看起来有点奇怪(因为你放弃了类型安全性)。但仔细看看WPF课程。他们都这样做(很可能有充分的理由)。或者WPF甚至会创建像PathFigureCollection这样的集合类,它们同时实现IListIList<PathFigure>