编译器错误MC3030:IEnumerable属性的所有者类必须实现IAddChild

时间:2015-05-22 21:35:45

标签: .net wpf xaml .net-4.0 compiler-errors

我正在尝试在.NET 4.0 Client Profile中构建自定义Panel子类。我开始是这样的:

public class MyPanel : Panel
{
    public MyPanel()
    {
    }
}

这可以很好地与XAML中的一些子控件集成(localMyPanel所在的命名空间的前缀):

<local:MyPanel>
    <Button/>
    <CheckBox/>
</local:MyPanel>

现在,我想向MyPanel添加一个集合属性。因此,我扩展了课程:

public class MyPanel : Panel
{
    public MyPanel()
    {
    }

    private readonly List<Button> someList = new List<Button>();

    public IList<Button> SomeList {
        get {
            return someList;
        }
    }
}

到目前为止,很好,上面的XAML代码仍在编译。

但是,我想在XAML中向SomeList属性添加一些元素,所以我写道:

<local:MyPanel>
    <local:MyPanel.SomeList>
        <Button/>
    </local:MyPanel.SomeList>
    <Button/>
    <CheckBox/>
</local:MyPanel>

不幸的是,这不再编译,因为编译器输出以下错误:

  

Bei der Eigenschaft“SomeList”handelt es sich umeineschreibgeschützteIEnumerable-Eigenschaft。 Das bedeutet,dass“IAddChild”von“MyNamespace.MyPanel”implementiert werden muss。 Zeile 9 Position 4.(MC3030)

英文(根据Unlocalize):

  

MC3030:'SomeList'属性是一个只读的IEnumerable属性,这意味着'MyNamespace.MyPanel'必须实现IAddChild。

显然,这是指System.Windows.Markup.IAddChild interface。这不是一个问题,似乎并不太复杂 - 所以,我在IAddChild中实现MyPanel(以一种没有用处的方式开始,但这不应该作为方法将不会在应用程序编译之前执行):

public class MyPanel : Panel, IAddChild
{
    public MyPanel()
    {
    }

    private readonly List<Button> someList = new List<Button>();

    public IList<Button> SomeList {
        get {
            return someList;
        }
    }

    public void AddChild(object value)
    {
        throw new NotImplementedException();
    }

    public void AddText(string text)
    {
        throw new NotImplementedException();
    }
}

这应该可行,但是...... 不,它没有!编译时我仍然得到相同的错误MC3030。

我完全按照错误消息指示,但错误并没有消失。我是否遗漏了编译器对我保密的任何其他修改?

documentation on IAddChild似乎没有提及与此情况相关的任何内容。此外,通过Google搜索连接到IAddChildWPF MC3030 ,只会将aforementioned Unlocalize entry作为唯一的相关结果。显然,错误MC3030是一个模糊的错误,到目前为止很少有开发人员遇到过。

1 个答案:

答案 0 :(得分:1)

出现该问题是因为该属性是作为通用集合类型公开的。如果您将属性类型从IList<Button>更改为IList,则错误应该消失。如果属性表示最终会在设计器中产生一些可见效果的集合,您可能还需要考虑将设计器序列化可见性设置为内容。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public IList SomeList
{
    get
    {
        return someList;
    }
}