2017-03-08 5 views
1

複数のコントロールを含む項目のプロパティを作成するにはどうすればよいですか?プロパティXamarinのグリッドを取得

グリッドから継承するUserControlがあります。子を追加するAddメソッドがあります。 UserControlをコードの背後に作成し、Addメソッドを使用すると、すべて正常に動作します。しかし、私はそれをXamlに追加したいと思っています。だから私はContentというプロパティを作った。セッターはうまくいくが、私はゲッターに何を入れるべきか分からない。私が試みたすべてが失敗しました。私はそれが複数の項目を含むことができるので、私は何を得なければならないのか分かりません。 My Addメソッドは単に行または列定義を作成し、他のレイアウト機能を実行します。セッターは、コンテンツに追加された各アイテムに対して呼び出されます(私の例では2回)。

public class MyControl : Grid 
    { 
    public View Content 
    { 
     get { return WHAT?; } 
     set { Add(value); } 
    } 

は、私はこのようにそれを使用したい:私がしようと

<controls:MyControl> 
    <controls:MyControl.Content> 
    <Label Text="test" /> 
    <Label Text="test" /> 
    </controls:MyControl.Content> 
</controls:MyControl> 

すべてがエラー「プロパティの内容がnullかIEnumerableをではありません」を与えます。

答えて

1

最初のコードサンプルでは、​​内部に1つの子コントロールしか保持できないコントロールについて説明しています。それは基本的にContentPageの機能です。あなたはsource code of ContentPageを見れば、それは、単純なバインド可能なプロパティContent持って:あなたが探しているもの

public static readonly BindableProperty ContentProperty = BindableProperty.Create(nameof(Content), typeof(View), typeof(ContentPage), null, propertyChanged: TemplateUtilities.OnContentChanged); 

public View Content 
{ 
    get { return (View)GetValue(ContentProperty); } 
    set { SetValue(ContentProperty, value); } 
} 

を複数の子ビューを持つことができStackLayoutに近いものです。

<StackLayout> 
    <Label> 
    <Label> 
</StackLayout> 

それは実際にこれを意味します:

<StackLayout> 
    <StackLayout.Children> 
     <Label> 
     <Label> 
    </StackLayout.Children> 
</StackLayout> 

StackLayout自体にはないスタックレイアウトでは、Childrenは、あなたがこれを書いたときにことを意味ContentProperty(代わりのContentPageでContent)であります興味深いコードの多くを含んでいますが、その親クラスLayout< T> and its base class Layoutがどのように処理するかを見てください。子は実際にはコレクションなので、getメカニズムのみを提供します。コレクションへのハンドルを取得したら、setメソッドを必要とせずに追加および削除できます。コンストラクタで

public IList<T> Children 
{ 
    get { return _children; } 
} 

あなたはElementCollection<T>オブジェクトとしてインスタンス化されるか_children見ることができます。

ビューのリストを持って、あなたが最も可能性が高いだけで大丈夫です、それをまとめるためには、このようなオブジェクト:

public IList<View> Children 
{ 
    get { return _children; } 
} 

// and the constructor 
public MyControl() { 
    _children = new List<View>(); 
} 

後、すべての設定方法の必要はありません。

+0

私が何をしようとしているのかわかっていればIDK。私は基本的に、Gridを使用して独自のタイプのStackLayoutを作成しようとしています。私はプロパティのコンテンツを呼びましたが、それは本当にグリッドの子です。私がSetterを削除すると、私のグリッドにはコンテンツがなくなります(私はAddメソッドを呼び出す方法がありません)。私はAddメソッドを呼び出すことができるように、どのようにアイテム(Xamlのもの)の追加を捕まえることができますか?私はそれを継承されたグリッドに直接追加したくありませんbc私はRowDefsまたはColumnDefsを追加してサイジングを設定する必要があります。コードでこれを行い、Addメソッドを呼び出すとうまくいきますが、Xamlでこれをやりたいのです。 – Kasper

+0

@カスパーああ、今は意味がある。リンクされているLayoutクラスを見ると、 'OnChildAdded'と' OnChildRemoved'メソッドを見ることができます。チェーンの上に行くと、 'OnInternalAdded'や' OnInternalRemoved'のようなメソッドに気付くでしょう。彼らはどのように動作するかを解読するためにいくつかの作業が必要かもしれませんが、それは良いスタートになるはずです。 – hankide

関連する問題