2010-11-28 24 views
2

私はカスタムメニューコントロールを部分的に学習練習として取り組んでおり、マークアップビューでVisual StudioのIntelliSenseサポートに問題があります。カスタムASP.NETメニューコントロール

従来のASP.NETメニューでは、<asp:MenuItem/>要素の任意の深さを要素の下に配置できます。私は私のメニューのために同じ行動をしています。

残念ながら私はしません。 VSは、空のタグを主張している:

<hn:AwesomeMenu runat="server" ID="menu"> 
    <Items /> 
</hn:AwesomeMenu> 

私は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 { ... } 
    } 
} 

インターフェイスの実装は、簡潔にするために省略されています。どんな助けもありがとう。

答えて

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メニューですこの属性を使用せずに同じ動作を実現します。

関連する問題