我正在开发一个自定义菜单控件,部分是作为一个学习练习,我在Visual Studio的标记视图中支持它时遇到了麻烦。
传统的ASP.NET菜单允许您在<asp:MenuItem/>
元素下放置任意深度的<Items>...</Items>
元素。我对我的菜单采取了同样的行为。
<hn:AwesomeMenu runat="server" ID="menu">
<Items />
</hn:AwesomeMenu>
我已经使用Reflector挖掘ASP.NET Menu控件及其相关的类(MenuItem,MenuItemCollection和soforth),并确保我的类具有相同的接口和属性,所以我有点难过到哪里我我出错了。到目前为止我的课程的存根如下:
AwesomeMenu.cs
public class AwesomeMenu
: HierarchicalDataBoundControl,
IPostBackEventHandler,
INamingContainer
{
[PersistenceMode(PersistenceMode.InnerProperty),
MergableProperty(false),
DefaultValue(default(string)),
Browsable(false)]
public AwesomeCollection Items
{
get { ... }
}
}
AwesomeCollection.cs
public class AwesomeCollection
: ICollection,
IEnumerable,
IStateManager
{ ... }
AwesomeItem.cs
[ParseChildren(true, "Children")]
public class AwesomeItem
: IStateManager,
ICloneable
{
[PersistenceMode(PersistenceMode.InnerDefaultProperty),
MergableProperty(false)]
public AwesomeCollection Children
{
get { ... }
}
public AwesomeItem Parent
{
get { ... }
}
}
为简洁起见,省略了接口实现。任何帮助将不胜感激。
答案 0 :(得分:1)
在很大程度上要归功于我发现的一篇博文(The ParseChildren PersistChildren and PersistenceMode.InnerProperty),我能够围绕上述属性的适当用法。
基本上我只需要菜单类本身的[ParseChildren(...)]
属性。所需行为的最小成功实现如下:
<强> Menu.cs 强>
[ParseChildren(ChildrenAsProperties = true)]
public class Menu
: Control
{
[PersistenceMode(PersistenceMode.InnerProperty),
Browsable(false)]
public List<Item> Items { get; set; }
}
<强> Item.cs 强>
[ParseChildren(
typeof(Item),
DefaultProperty = "Items",
ChildrenAsProperties = true)]
public class Item
{
public string Text { get; set; }
[Browsable(false)]
public List<Item> Items { get; set; }
}
我唯一的问题是ASP.NET菜单如何在不使用此属性的情况下实现相同的行为。