【问题标题】:Xamarin Forms ListView BindingXamarin 表单 ListView 绑定
【发布时间】:2016-10-10 02:50:09
【问题描述】:

现在我正在尝试让 ListView 拥有一些可绑定的 CustomCell。我将 XAML 中的单元格定义为 ListView.ItemTemplate 下 DataTemplate 下的 ViewCell。

为了简单起见,我在 Cell 中有两个字符串表示。 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 中引用它,但您不必也可以完全按照您在上面所做的那样做。您有具体问题吗?
  • 我想我在这里误解了一些基本的东西。我不确定如何引用该文件,您是否建议这应该在标签中完成?我也不明白我如何填充列表。我更新了我的问题以使其更加明显。
  • 查看我的回答,如果您仍有问题,请告诉我

标签: c# xaml listview xamarin.forms


【解决方案1】:

您需要将ListViews ItemsSource(不是ItemSource)属性设置为项目列表。该项目列表应包含在您的视图中。像这样的:

<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 将绑定到的所有属性。绑定从ListView.ItemsSource 传递到您的ListView.ItemTemplate。该绑定不需要ViewCell 具有任何特殊属性以使绑定起作用。我希望这是有道理的。如果不让我知道听起来不对的地方。

【讨论】:

  • 谢谢,你真的救了我。
  • @why_vincent 当然,很乐意提供帮助
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 2021-10-20
  • 2017-04-05
  • 1970-01-01
  • 2021-11-08
  • 2017-10-11
  • 2017-04-16
  • 2015-11-05
相关资源
最近更新 更多