2017-03-08 20 views
1

如何为包含多个控件的项目创建属性?Xamarin上的网格属性Getter

我有一个从Grid继承的UserControl。我有一个Add方法来添加孩子。一切工作正常,如果我在后面的代码中创建UserControl并使用我的Add方法。但是我希望能够在Xaml中添加它。所以我做了一个名为Content的属性。 Setter工作正常,但我无法弄清楚在Getter中放什么。我尝试过的所有东西都失败了。我不确定我应该得到什么,因为它可以包含多个项目。我的Add方法只是创建行或列定义并执行其他布局功能。 Setter会为内容中添加的每个项目调用(在我的示例中是这样两次)。

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> 

一切我试着给出了错误“物权内容为空或不IEnumerable的”。

回答

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可以有多个孩子的意见。在堆栈布局,ChildrenContentProperty(而不是在ContentPage Content),这意味着,当你这样写:

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

实际上就意味着这一点:

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

StackLayout本身不包含很多有趣的代码,但你应该看看它的父类Layout< T> and its base class Layout如何处理事情。由于儿童实际上是一个集合,它只提供获取机制。一旦你掌握了收藏,你可以添加和删除它,而不需要设置方法。

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

在构造函数中,你可以看到如何_children被实例化为ElementCollection<T>对象。

概括起来,你很可能只是罚款与具有查看的对象列表如下:

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

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

无需set方法毕竟。

+0

IDK,如果我清楚我正在尝试做什么。我基本上正在尝试使用Grid创建自己的StackLayout类型。我称属性内容,但是它确实是网格的子节点。当我删除Setter时,我的网格中不再有任何内容(但我没有办法调用我的Add方法)。我怎样才能捕获项目的添加(Xaml中的项目),以便我可以调用我的Add方法?我不想直接将它添加到继承的Grid中,我必须添加RowDefs或ColumnDefs并设置大小。如果我在代码中这样做,只是调用我的添加它工作正常,但我想在Xaml中执行此操作。 – Kasper

+0

@Kasper阿好吧,现在有道理。如果你看看我链接到的布局类,你可以看到'OnChildAdded'和'OnChildRemoved'方法。当你上链时,你会注意到像OnInternalAdded和OnInternalRemoved这样的方法。可能需要一些工作来破译他们的工作方式,但这应该是一个好的开始。 – hankide