2009-07-16 15 views
2

XAMLを使用してWPFコントロールに追加できるカスタムクラスセットを作成しようとしています。カスタムWPFコレクションを作成するには?

私が抱えている問題は、コレクションにアイテムを追加することです。ここに私がこれまで持っているものがあります。

public class MyControl : Control 
{ 
    static MyControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl))); 
    } 

    public static DependencyProperty MyCollectionProperty = DependencyProperty.Register("MyCollection", typeof(MyCollection), typeof(MyControl)); 
    public MyCollection MyCollection 
    { 
     get { return (MyCollection)GetValue(MyCollectionProperty); } 
     set { SetValue(MyCollectionProperty, value); } 
    } 
} 

public class MyCollectionBase : DependencyObject 
{ 
    // This class is needed for some other things... 
} 

[ContentProperty("Items")] 
public class MyCollection : MyCollectionBase 
{ 
    public ItemCollection Items { get; set; } 
} 

public class MyItem : DependencyObject { ... } 

そしてXAML。

<l:MyControl> 
    <l:MyControl.MyCollection> 
     <l:MyCollection> 
      <l:MyItem /> 
     </l:MyCollection> 
    </l:MyControl.MyCollection> 
</l:MyControl> 

例外は次のとおりです。 System.Windows.Markup.XamlParseException occurred Message="'MyItem' object cannot be added to 'MyCollection'. Object of type 'CollectionTest.MyItem' cannot be converted to type 'System.Windows.Controls.ItemCollection'.


は、いずれかが、私はこの問題を解決する方法を知っていますか?ありがとう

+0

System.Collections.ObjectModelのDOM中心のコレクションクラスの1つから基本クラスを継承できますか?これらのクラス(Collection、KeyedCollectionなど)は、オーバーライド可能な追加/削除機能をサポートするため、DOMスタイルのインターフェイスを作成するのに最適です。私はこれがあなたの質問への直接的な反応ではないことを知っていますが、このようにしない理由があれば疑問に思っていますか? – Adrian

答えて

3

は、私は同じエラーメッセージを持っていたthisブログを見つけました。 IListも実装する必要があるようです。

public class MyCollection : MyCollectionBase, IList 
{ 
    // IList implementation... 
} 
+0

これは元のコードとは異なります。アイテムを 'Items'プロパティではなく、' MyCollection'自体に追加します。 –

0

のコンストラクタにItemCollectionのインスタンスを作成して、それをItemsプロパティに割り当てるのを忘れたのでしょうか? XAMLパーサーが項目を追加するには、既存のコレクションインスタンスが必要です。新しいコレクションは作成されません(ただし、コレクションプロパティにセッターがある場合はXAMLで明示的に作成できます)。だから、:もっとグーグル後

[ContentProperty("Items")] 
public class MyCollection : MyCollectionBase 
{ 
    public ObservableCollection<object> Items { get; private set; } 

    public MyCollection() 
    { 
     Items = new ObservableCollection<object>(); 
    } 
} 
+1

ItemCollectionにはパブリックプロパティがありません。それを作成する別の方法がありますか? –

+0

申し訳ありませんが、私は公共のコンストラクタを意味しませんでした。 –

+0

良い点 - それは '内部 'のように見え、実際には' ItemsControl'によってのみ使用されることを意図しています。だから、 'ItemsControl'(クラスにとって意味がある場合)から派生するか、' ObservableCollection 'のような他のXAMLサポートコレクションクラスを使用してください。私はそれに応じて例を更新しました。 –

関連する問題