2017-11-20 5 views
1

私はXFリストビューを使用していますが、オブジェクト全体をバインドしてコンバーターを使用していくつかの条件に基づいてデータをフォーマットしたいのですが、オブジェクトバインディングはXFではもう機能しません。テストはXF 2.5.0.91635、アンドロイドサポートライブラリ26.1.0.1で行われます。オブジェクトバインドが機能しません

<ListView x:Name="lv"></ListView> 

enter image description here

しかし、項目テンプレートを使用した場合、何も表示されないの数が、:コンテンツは、デフォルトのオブジェクトの文字列を示しているもののまず、とき、リストビューが正しくレンダリングされる、項目テンプレートを使用していませんアイテムは実際にリストビューで追加され、アイテム選択されたイベントは正しく起動されます。また、デバッグ出力はメッセージ次:

 <ListView x:Name="lv"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <Label Text="{Binding}"></Label> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

enter image description here

[0:] Binding: Models.DataItem can not be converted to type 'System.String' 
[0:] Binding: Models.DataItem can not be converted to type 'System.String' 
[0:] Binding: Models.DataItem can not be converted to type 'System.String' 
[0:] Binding: Models.DataItem can not be converted to type 'System.String' 
[0:] Binding: Models.DataItem can not be converted to type 'System.String' 

を私はバインディング式にコンバータを追加する際に、変換関数は常にその引数にnullを受けます。

はバインディングのコードを追加します。

例えば:

private ObservableCollection<Models.DataItem> _dataList; 
public ObservableCollection<Models.DataItem> DataList 
{ 
    get { return _dataList; } 
    set 
    { 
     _dataList = value; 
     RaisePropertyChanged(() => DataList); // you can use your own property notification mechanism here. 
    } 
} 

次に設定した後にバインドする

List<DataItem> list = new List<DataItem>(); 
     for(int i = 0; i < 10; i++) 
     { 
      list.Add(new DataItem 
      { 
       N = "L " + i.ToString(), 
       C = i + 1, 
      }); 
     } 
     lv.ItemsSource = list; 
+0

ありません何が起こっているか完全に確かめていますが、この ''のように定義することを正しく理解していますか?通常、 ''のように定義します。ここで、 'PropertyOnModel'はデータバインドモデルのプロパティか、少なくとも' 'モデルオブジェクト全体にバインドします。これで問題は解決しますか? –

+0

ええ、プロパティへのバインディングは動作しますが、意図的にオブジェクト全体にバインドしてコンバーターに渡したいと思うので、 '{Binding。} 'や' {Binding Path =。} '。 – fluter

答えて

1

を助け、常にその引数にnullを受け取ります。

あなたがオブジェクト全体にバインドしたい場合は、このようなDataItemを変更する必要があります。

public class DataItem 
{ 
    public String N { get; set; } 
    public int C { get; set; } 

    //use an Item property to reference itself 
    public DataItem Item { get { return this; } } 
} 

次にあなたが一緒にコンバータを使用してListViewでそれを使用することができます。

<ListView x:Name="lv" > 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
        <Label Text="{Binding Item,Converter={StaticResource YourConverter}}" ></Label> 
       </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 
+0

それは華麗ですが、この方法については決して考えなかった、ありがとう!どのようにしてこのアイデアを得るのですか?この回避策のソースやドキュメントはありますか? – fluter

+0

申し訳ありません。 –

0

正しい方法は、 "リストビューのコレクションをバインド" およびリストについては、ItemSourceを提供することですViewModelへのバインディングコンテキスト:

<ListView ItemsSource="{Binding DataList}" > 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <Label Text="{Binding . }" /> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

それともDataItemを次の中からプロパティを表示したい場合:

public class Model.DataItem 
{ 
    public string Property1 {get; set; } 
    public string Property2 {get; set; } 
    public string Property3 {get; set; } 
} 

使用

<ViewCell> 
    <Label Text="{Binding Property1 }" /> 
    <Label Text="{Binding Property2 }" /> 
    <Label Text="{Binding Property3 }" /> 
</ViewCell> 

希望私はバインディング式にコンバータを追加するとき、これは、変換機能を

+0

投稿していただきありがとうございますが、私が求めていることではなく、コレクションとプロパティのバインドにバインドする方法を知っています。ここでの問題は、xamarinランタイムは、コンバーターを使用していても、オブジェクトバインディングを処理できないため、常にnullを受け取ります。 – fluter

+0

viewmodelとコンバーターコードを含む "実際の"コードを投稿できますか?あなたの質問が適切な意味を持っていないからです。 –

+0

私はちょうどバインディングコードを追加しました。あなたが実際にそれをテストすれば、問題は完璧です。問題はコンバータが関与していないので、私はコンバータを使用してさらに問題を確認しました。 – fluter

関連する問題