Xamarin.Forms: добавить метки внутри ListView? - PullRequest
0 голосов
/ 20 февраля 2019

Я все еще учусь, поэтому, пожалуйста, потерпите меня.

Я пытаюсь отобразить 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.Вы можете увидеть скриншот здесь .

Теперь вместо того, чтобы просто показывать магазин 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>

У меня есть доступ к Name и Description в коде позади (с desc = item.Value<string>("description");, ноЯ не знаю, как связать эти значения с метками в форме.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Определить класс со свойствами

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>
0 голосов
/ 22 февраля 2019

В коде Ankit tyagi они написали два viewcell в его xaml.удалить один из них.Полностью создаются процессы привязки данных к списку.

Прежде всего определите вашу модель.

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

0 голосов
/ 20 февраля 2019

Вам нужно указать Binding .. Забавные свойства в вашем классе: Name и Description, тогда вы бы сделали это

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

Примечание : вам не нужно использовать x: Name, если вам не нужен прямой доступ к ним из Code-Behind

<Label Text="{Binding Name}" />
<Label Text="{Binding Description}" />

Обновлено

Спасибо за ваш ответ.Но что мне нужно сделать в коде?К какому объекту я бы их привязал?

Когда вы указываете привязку в ItemTemplate, вы привязываетесь к отдельным свойствам класса в списке, который listview указал как ItemsSource

...