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

发布于 12-01 08:50 字数 1363 浏览 1 评论 0原文

我在 ViewModel 中有一个 ObservableCollection,其中 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"; } }
}

I have in the ViewModel an ObservableCollection<INode> where INode is an interface.

The View XAML is like:

<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>
    ...

Now this works at runtime, but not in the design time window which shows:
Could not create an instance of type 'MyNode'

Any idea how to solve this?


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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不知在何时2024-12-08 08:50:48

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

其他人可能对设计时流程有更多技巧或更多见解。

Each case seem to be unique. Here's what I learned after solving it: Not only an exception in the constructor can generate that error message. If some system methods like GetHashCode() throw and exception, it'll display that same message (some times at design-time only).

Other people may have more tips or more insight VS design-time flow.

月隐月明月朦胧2024-12-08 08:50:48

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

尝试将您的节点添加为

<n:MyNode Name="blah" />

As far as I can see it is not a XAML problem, but happens because you are not setting the Name property. When GetHashCode is called it will fail because you are calling a method on a null reference.

Try adding your node as

<n:MyNode Name="blah" />
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文