接口/抽象的XAML集合“无法创建实例”

时间:2011-08-23 13:16:55

标签: wpf list xaml collections abstract

我在 ViewModel 中有一个ObservableCollection<INode>,其中INode是一个接口。

查看XAML 就像:

<Windows x:Class="XXX.Window1"
         xmlns:vw="clr-namespace:XXX.Views" 
         xmlns:vm="clr-namespace:XXX.ViewModels" 
         xmlns:n="clr-namespace:XXX.Models.Nodes"
         ... />
    ...
    <vm:MyView>
        <vw:MyView.DataContext>
            <vm:MyViewModel>
                <vm:ComponentViewModel.Nodes>
                    <n:MyNode />                <--- PROBLEM HERE
                    <n:MyNode />
                </vm:ComponentViewModel.Nodes>
            </vm:MyViewModel>
        </vw:MyView.DataContext>
    </vm:MyView>
    ...

现在这可以在运行时工作,但不能在设计时间窗口中显示: 无法创建“MyNode”类型的实例

知道如何解决这个问题吗?


interface INode
{
    string Name { get; set; }

    string Status { get; }
}

abstract class Node : INode
{
    public string Name { get; set; }

    public abstract string Status { get; }

    public override int GetHashCode()
    {
        unchecked
        {
            return Name.GetHashCode();     // <--- PROBLEM WAS HERE, Name = null
        }
    }
}

class MyNode : Node
{
    public override NodeStatus Status { get { return "test"; } }
}

2 个答案:

答案 0 :(得分:0)

每个案例似乎都是独一无二的。这是我在解决它之后学到的:不仅构造函数中的异常可以生成该错误消息。如果某些系统方法如GetHashCode()抛出和异常,它将显示相同的消息(有时在设计时)。

其他人可能有更多提示或更多洞察VS设计时流程。

答案 1 :(得分:0)

据我所知,它不是XAML问题,但是因为你没有设置Name属性。当调用GetHashCode时,它将失败,因为您在空引用上调用方法。

尝试将您的节点添加为

<n:MyNode Name="blah" />