Xamarin.Forms:在ListView内添加标签?

时间:2019-02-20 01:57:19

标签: c# xamarin xamarin.forms visual-studio-2017 xamarin.forms.listview

我还在学习,所以请忍受我。

我正在尝试在ListView中显示一个Xamarin.Form。到目前为止,这就是我所拥有的,并且效果很好:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
             xmlns:local="clr-namespace:GasStations"
             x:Class="GasStations.MainPage">
        <StackLayout>
            <ListView x:Name="ListView_Pets">
            </ListView>
        </StackLayout>
</ContentPage>

这是背后的代码:

var obj = JsonConvert.DeserializeObject(coord);
List<String> storeList = new List<String>();
string store = string.Empty;
foreach (var item in ((JArray)obj))
{
    store = item.Value<string>("name");
    //desc = item.Value<string>("description"); /* This is the string I want to display */
    storeList.Add(store);
}
ListView_Pets.ItemsSource = storeList;

它有效,并且在ListView中显示商店名称。您可以看到screenshot here

现在,我不仅要显示Name中的商店ListView,还要显示说明(以及其他任何值)。我假设每行都需要Labels,类似于asp.net GridView ItemTemplate

我尝试了类似的方法,但是没有建立:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
             xmlns:local="clr-namespace:GasStations"
             x:Class="GasStations.MainPage">
    <StackLayout>
        <ListView x:Name="ListView_Pets" ItemsSource="{Binding MyClass}" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <Label x:Name="Label_Name" Text="Name" />
                            <Label x:Name="Label_Desc" Text="Description" />
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

我可以使用后面的代码访问NameDescription(使用desc = item.Value<string>("description");,但是我不知道如何将这些值绑定到表单中的标签。

3 个答案:

答案 0 :(得分:3)

您需要指定 Binding 。。有趣的类中的属性是NameDescription,那么您可以这样做

<Label x:Name="Label_Name" Text="{Binding Name}" />
<Label x:Name="Label_Desc" Text="{Binding Description}" />

注意 :除非您需要直接从Code-Behind

访问它们,否则无需使用x:Name。 >
<Label Text="{Binding Name}" />
<Label Text="{Binding Description}" />

已更新

  

感谢您的回答。但是我需要在后面的代码中做什么?   我将它们绑定到什么对象上?

ItemTemplate中指定绑定时,您将绑定到listview已指定为ItemsSource的列表中类的各个属性

答案 1 :(得分:1)

使用属性定义类

public MyClass(){

public string Name{get;set;}
public string Description{get;set;}
}

之后然后在后面的代码中

var obj = JsonConvert.DeserializeObject<List<MyClass>>(coord);
ListView_Pets.ItemsSource = obj;

然后在列表视图中更新

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
             xmlns:local="clr-namespace:GasStations"
             x:Class="GasStations.MainPage">
    <StackLayout>
        <ListView x:Name="ListView_Pets" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell>
                          <StackLayout Orientation="Vertical">
                            <Label Text="{Binding Name" />
                            <Label Text="{Binding Description}" />
                          </StackLayout>
                        </ViewCell>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

答案 2 :(得分:1)

在Ankit tyagi的代码中,他们在他的xaml中写了两个viewcell。删除其中之一。 完全有将数据绑定到列表视图的创建过程。

首先定义您的模型。

public class MyClass
{
    public string Name { get; set; }
    public string Description { get; set; }
}

然后,在后面的代码中定义一个数据源。建议您使用ObservableCollection收集数据。 ObservableCollection是一个通用的动态数据集合,可在添加,删除项目或刷新整个集合时提供通知(使用接口“ INotifyCollectionChanged”)

         public ObservableCollection<MyClass> DataSource { get; set; }
    public MainPage()
    {
        this.BindingContext = this;

        DataSource = new ObservableCollection<MyClass>();

        DataSource.Add(new MyClass() { Name = "Item 1", Description = "Sub Item Text 1" });
        DataSource.Add(new MyClass() { Name = "Item 2", Description = "Sub Item Text 2" });
        DataSource.Add(new MyClass() { Name = "Item 3", Description = "Sub Item Text 3" });


        InitializeComponent();
    }

最后,在您的xaml中定义一个列表视图。不要忘记绑定后面的代码中的源数据。

    <StackLayout>
    <ListView x:Name="ListView_Pets" 
              ItemsSource="{Binding DataSource}" 
              HorizontalOptions="FillAndExpand"
              VerticalOptions="FillAndExpand"
              SeparatorColor="Silver">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>

                    <StackLayout Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" >
                            <Label Text="{Binding Name}" />
                             <Label Text="{Binding Description}" />
                        </StackLayout>

                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

运行这些代码。

enter image description here