在XAML中填充通用列表

时间:2017-09-28 11:06:10

标签: xaml xamarin xamarin.forms

我有自定义页面和自定义控件。

 var input = document.querySelector('input[name="username"]');
 input.value= 'whatever;

所以我的页面有一个Tiles Collection,即Frames。 现在我想通过XAML填充Collection。

我的XAML Sytax是这样的:

public class TilesPage : ContentPage
{
    public ObservableCollection<Tile> Tiles
    {
        get;
        set;
    }
}

public class Tile : Frame
{
    public static readonly BindableProperty TitleProperty = BindableProperty.Create(nameof(Title), typeof(string), typeof(Tile), null);

    public Tile()
    {
        HasShadow = false;
    }

    public string Title
    {
        get
        {
            return (string)GetValue(TitleProperty);
        }
        set
        {
            SetValue(TitleProperty, value);
        }
    }
}

但收藏品仍然是空的。 XAML不接触它。

那么我的语法有什么问题?

1 个答案:

答案 0 :(得分:1)

我在代码中看到了两个问题:

  1. 我们需要一个调用InitializeComponent()

    的默认构造函数
    public TilesPage()
    {
        InitializeComponent();
    }
    
  2. XAML解析器此时需要一个非空集合 - 这样它就可以添加多个元素。否则它会抛出一个解析异常 类型不匹配或空值。要解决这个问题,我们需要确保有一个默认值可以使用。

    public ObservableCollection<Tile> _tiles = new ObservableCollection<Tile>();
    public ObservableCollection<Tile> Tiles { 
        get { return _tiles; }
        set { _tiles = value; }
    }
    
  3. 您现在应该可以看到更新的集合:

    protected override void OnAppearing()
    {
        base.OnAppearing();
    
        Debug.WriteLine(Tiles?.Count);
        foreach (var tile in Tiles)
            Debug.WriteLine(tile.Title);
    }
    

    此外,建议将此属性转换为可绑定 - 以便更轻松地与XAML框架集成(非强制性)。

    public static readonly BindableProperty TilesProperty = 
              BindableProperty.Create(nameof(Tiles), typeof(IList<Tile>), typeof(TilesPage), 
              defaultValue: new ObservableCollection<Tile>());
    
    public IList<Tile> Tiles
    {
        get
        {
            return (IList<Tile>)GetValue(TilesProperty);
        }
        set
        {
            SetValue(TilesProperty, value);
        }
    }