XAML界面/抽象集合“无法创建实例”

3

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

View 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"; } }
}

请展示 MyNode 的定义以及该设计时异常的完整堆栈跟踪和错误信息。 - Daniel Hilgarth
MyNode是INode的具体实现。由于这是一个设计时错误,所以我无法提供堆栈跟踪。也就是说,在Visual Studio中查看XAML时发生的错误。 - Wernight
请展示 MyNode 的代码。没有代码很难确定问题所在。很可能是构造函数抛出了异常。 - Daniel Hilgarth
MyNode 需要一个默认的构造函数才能在设计器中运行。请同时向我们展示“n”命名空间的导入。 - Bahri Gungor
我删除了MyNode的构造函数,只保留了默认的构造函数。在出现异常的情况下,通常会显示另一个错误:异常本身。但我会添加更多细节。 - Wernight
显示剩余2条评论
2个回答

0
每个情况似乎都是独特的。在解决它之后,我学到了这些:不仅构造函数中的异常会生成该错误消息。如果某些系统方法(如GetHashCode())引发异常,它将显示相同的消息(有时仅在设计时)。其他人可能有更多提示或更深入的VS设计时流程见解。

0
据我所见,这不是XAML的问题,而是因为您没有设置名称属性导致的。当调用GetHashCode时,它将失败,因为您正在对空引用调用方法。
尝试将您的节点添加为
<n:MyNode Name="blah" />

是的,我看到了,现在已经修复了。不过,它已经被设置了,只是在设计时调用该属性时没有被设置。 - Wernight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接