gpt4 book ai didi

c# - Xamarin Forms ListView 绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 17:51:41 24 4
gpt4 key购买 nike

现在我正在尝试让 ListView 具有一些可绑定(bind)的 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,我在代码隐藏文件中设置了绑定(bind)上下文。我的问题如下,我是否在 C# 中定义了一个扩展 ViewCell 的类以绑定(bind)数据?如前所述,我不想在 C# 中定义布局。我想以这样的方式绑定(bind)。我想避免引用字段,因为文件背后的代码倾向于引用组件。这可能吗?我查看了 Xamarin 网站,该示例混合使用了代码隐藏和 XAML(如果我正确解释它......)。

编辑 1:

我尝试编写一个模仿一些示例的文件,但这还不够。没有一段代码解释这个文件是代表 XAML 中的 ViewCell 的文件,并且没有明显的方法让我在不访问代码隐藏中的列表字段的情况下填充列表。如果我只想使用绑定(bind)向此列表添加一些项目,我错过了什么?

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

最佳答案

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

<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 用于容纳其他项目,例如 StackLayoutLabels。但它不必包含那些 Label 将绑定(bind)到的所有属性。绑定(bind)从 ListView.ItemsSource 传递到您的 ListView.ItemTemplate。该绑定(bind)不需要 ViewCell 具有绑定(bind)工作的任何特殊属性。我希望这是有道理的。如果不是,请告诉我哪里听起来不对。

关于c# - Xamarin Forms ListView 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37726157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com