2017-09-28 14 views
0

私はカスタムページとカスタムコントロールを持っています。XAMLの汎用リストにデータを埋め込む

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経由で取り込みたいと思います。

<?xml version="1.0" encoding="utf-8" ?> 
<CPages:TilesPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="MyNamespace.AboutPage" 
      xmlns:CControls="clr-namespace:MyNamespace;assembly=MyAssembly" 
      xmlns:CPages="clr-namespace:MyNamespace;assembly=MyAssembly" 
      > 
    <CPages:TilesPage.Tiles> 
     <CControls:Tile Title="Test"> 
      <CControls:Tile.Content> 
       <Label>In Tile</Label> 
      </CControls:Tile.Content> 
     </CControls:Tile> 
    </CPages:TilesPage.Tiles> 
</CPages:TilesPage> 

しかし、コレクションは空のまま:

私のXAML Sytaxはこのようなものです。 XAMLはそれに触れません。

私の構文で何が問題になっていますか?

+0

**依存性プロパティ**を使用してください。 –

答えて

1

は、私がコードで見る二つの問題があります。

  1. 我々はInitializeComponent()

    public TilesPage() 
    { 
        InitializeComponent(); 
    } 
    
  2. XAMLパーサーが、この時点ではないヌルコレクションを見込んで呼び出すデフォルトコンストラクタを必要とする - そう複数の要素を追加することができます。それ以外の場合は、 型不一致またはnull値のいずれかの解析例外がスローされます。これを修正するには、使用するデフォルト値があることを確認する必要があります。

    public ObservableCollection<Tile> _tiles = new ObservableCollection<Tile>(); 
    public ObservableCollection<Tile> Tiles { 
        get { return _tiles; } 
        set { _tiles = value; } 
    } 
    

あなたは今、更新コレクション見ることができるはずです。また

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); 
    } 
} 
+0

うん、私はInitializeComponentsを逃した。 – Chris

関連する問題