我正在尝试在.NET 4.0 Client Profile中构建自定义Panel
子类。我开始是这样的:
public class MyPanel : Panel
{
public MyPanel()
{
}
}
这可以很好地与XAML中的一些子控件集成(local
是MyPanel
所在的命名空间的前缀):
<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搜索连接到IAddChild
或WPF
的 MC3030 ,只会将aforementioned Unlocalize entry作为唯一的相关结果。显然,错误MC3030是一个极模糊的错误,到目前为止很少有开发人员遇到过。
答案 0 :(得分:1)
出现该问题是因为该属性是作为通用集合类型公开的。如果您将属性类型从IList<Button>
更改为IList
,则错误应该消失。如果属性表示最终会在设计器中产生一些可见效果的集合,您可能还需要考虑将设计器序列化可见性设置为内容。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public IList SomeList
{
get
{
return someList;
}
}