web-dev-qa-db-ja.com

XamarinフォームListViewバインディング

現在、ListViewにいくつかのバインド可能なCustomCellを持たせようとしています。 XAMLでセルをListView.ItemTemplateの下のDataTemplateの下のViewCellとして定義しました。

単純化するために、セルで表す2つの文字列があるとしましょう。 ViewCellは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml" x:Class="simpletest.MyPage2">
    <ContentPage.Content>
        <StackLayout Spacing="10" x:Name="layout" Padding="8,10">
            <Label Text="{Binding Something}" />
            <ListView x:Name="listView">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Orientation="Horizontal">
                                <Label Text="{Binding Name}" />
                                <Label Text="{Binding Price}" />
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

これをXAMLで維持したいのですが。私はすべてをC#で書くことでこれを膨張の世界に変えるのは好きではありません。

このページのViewModelがあり、コードビハインドファイルでバインディングコンテキストを設定します。私の質問は次のとおりです。データをバインドするためにC#でViewCellを拡張するクラスを定義しますか?前述のように、C#でレイアウトを定義したくありません。そんなふうに縛りたい。ファイルの背後にあるコードはコンポーネントを参照する傾向があるため、フィールドの参照を避けたいと思います。これは可能ですか?私はXamarinのサイトを確認しました。この例では、コードビハインドとXAMLを組み合わせて使用​​しています(正しく解釈した場合...)。

編集1:

いくつかの例を模倣したファイルを書いてみましたが、これでは不十分です。このファイルがXAMLのViewCellを表すファイルであることを説明するコードはありません。また、コードビハインドでリストフィールドにアクセスせずにリストにデータを入力する明確な方法はありません。バインディングを使用してこのリストにアイテムを追加したいだけの場合、何が不足していますか?

public class ReportedAssignmentCell : ViewCell
{
    public ReportedAssignmentCell()
    {
    }

    public static readonly BindableProperty NameProperty = BindableProperty.Create("Name", typeof(string), typeof(ReportedAssignmentCell), "");
    public static readonly BindableProperty PriceProperty = BindableProperty.Create("Price", typeof(string), typeof(ReportedAssignmentCell), "");



    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
    public string Price
    {
        get { return (string)GetValue(PriceProperty); }
        set { SetValue(NameProperty, value); }
    }
}
10
why_vincent

ListViews ItemsSourceItemSourceではなく)プロパティを項目のリストに設定する必要があります。そのアイテムのリストは、ビュー内に含まれている必要があります。このようなもの:

<ListView ItemsSource="{Binding ListOfItems}" ...>
...
</ListView>

次に、ViewModelで:

private ObservableCollection<ItemModel> _listOfItems;
public ObservableCollection <ItemModel> ListOfItems {
    get { return _listOfItems ?? _listOfItems == new ObservableCollection<ItemModel>; }
    set {
        if(_listOfItems != value) {
            _listOfItems = value;
            SetPropertyChanged();
        }
    }

ここで、そのカスタムReportedAssignmentCellを使用したい場合は使用できますが、StackLayoutLabelsをそのままにしておくこともできます。上記で説明したようにItemsSourceを設定してみてください。投稿した現在のListView XAMLを使用して、探している効果が得られるかどうかを確認してください。そうでない場合は、お知らせください。

ViewCellは、StackLayoutsやLabelsなどの他のアイテムを保持するためのものです。ただし、これらのLabelsがバインドするすべてのプロパティを含む必要はありません。 BindingはListView.ItemsSourceListView.ItemTemplate。そのバインディングでは、バインディングが機能するためにViewCellが特別なプロパティを持つ必要はありません。私はそれが理にかなっていると思います。そうでない場合は、正しく聞こえないことを知らせてください。

7
hvaughan3