Xamarin Forms ListView绑定

13

我现在正在尝试使一个 ListView 具有可绑定的自定义单元格。我在 XAML 中将单元格定义为 DataTemplate 下的 ViewCell,在 ListView.ItemTemplate 下使用。

为了简单起见,假设我要在单元格中表示两个字符串。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); }
    }
}

你编写的代码应该是正常工作的。如果你想要扩展或自定义 ViewCell,那么可以在 C# 代码中进行扩展并在 XAML 中引用它,但这并不是必须的,你可以完全像上面所做的那样。你是否遇到了具体的问题? - hvaughan3
我觉得我在这里误解了一些基本的东西。我不确定如何引用文件,你建议应该在标签中完成这个操作?我也不明白如何填充列表。我更新了我的问题以使这更加明显。 - why_vincent
看看我的答案,如果你还有问题的话,请告诉我。 - hvaughan3
1个回答

11

您需要将ListViewItemsSource属性(而不是ItemSource)设置为项目列表。该项目列表应包含在您的视图中。例如:

listView.ItemsSource = new List<string> { "item1", "item2", "item3" };

<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用于容纳其他项目,例如StackLayoutsLabels,但不必包含这些Labels将要绑定到的所有属性。该绑定从ListView.ItemsSource传递到您的ListView.ItemTemplate中。该绑定不需要ViewCell具有任何特殊属性才能正常工作。我希望这是有意义的。如果不是,请告诉我哪里有问题。


谢谢,你真的救了我。 - why_vincent
@why_vincent 当然可以,很乐意帮助你 - hvaughan3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接