Hello,
Welcome to our Microsoft Q&A platform!
If you want to change it at runtime, use MVVM is a good choose.
Here is my edited layout. I bind a Command to Button.
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyTabbedPaged.Views.Page2">
<ContentPage.Content>
<ScrollView HeightRequest="300">
<ListView x:Name="listView" ItemsSource="{Binding myList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell >
<StackLayout Orientation="Horizontal" >
<Image Source="{Binding Image}"></Image>
<Label Text="{Binding Symbol}"
FontSize="24"
VerticalOptions="Center" />
<Label Text="{Binding Price}"
FontSize="24"
VerticalOptions="Center" />
<Button Text="Click me" Command="{Binding Path=BindingContext.ChangeCommand, Source={x:Reference Name=listView}}" CommandParameter="{Binding .}"></Button>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollView>
</ContentPage.Content>
</ContentPage>
Here is background code. If you want to update data at runtime, you should achieve INotifyPropertyChanged for InForOfCrypto.cs. Then you click the Button, the ChangeCommand will be executed. change the code like following command.
ChangeCommand = new Command<InForOfCrypto>(async (key) =>
{
InForOfCrypto inForOfCrypto = key as InForOfCrypto;
inForOfCrypto.Price = "111111111111111";
});
Here is layout background code
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace MyTabbedPaged.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Page2 : ContentPage
{
public Page2 ()
{
InitializeComponent ();
BindingContext = new MyViewModel();
//ObservableCollection<InForOfCrypto> myList = new ObservableCollection<InForOfCrypto>();
//string url = "https://icons.iconarchive.com/icons/cjdowner/cryptocurrency/256/Ethereum-icon.png";
//List<PRICE> listOfPrice = CallPriceAPIFromBinnces();
//for (int i = 0; i < 15; i++)
//{
// myList.Add(new InForOfCrypto() { Image = url, Symbol = listOfPrice[i].symbol, Price = listOfPrice[i].price });
//}
//listView.ItemsSource = myList;
}
}
public class MyViewModel
{
public ICommand ChangeCommand { protected set; get; }
public ObservableCollection<InForOfCrypto> myList { get; set; }
public MyViewModel()
{
myList = new ObservableCollection<InForOfCrypto>();
string url = "https://icons.iconarchive.com/icons/cjdowner/cryptocurrency/256/Ethereum-icon.png";
List<PRICE> listOfPrice = CallPriceAPIFromBinnces();
for (int i = 0; i < 15; i++)
{
myList.Add(new InForOfCrypto() { Image = url, Symbol = listOfPrice[i].symbol, Price = listOfPrice[i].price });
}
ChangeCommand = new Command<InForOfCrypto>(async (key) =>
{
InForOfCrypto inForOfCrypto = key as InForOfCrypto;
inForOfCrypto.Price = "111111111111111";
});
}
private List<PRICE> CallPriceAPIFromBinnces()
{
// If you get data from api from here, I add some data to test
var list = new List<PRICE>();
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
list.Add(new PRICE() { price = "1", symbol = "23" });
list.Add(new PRICE() { price = "2", symbol = "234" });
return list;
}
}
public class InForOfCrypto: INotifyPropertyChanged
{
// public string Image { get; set; }
//public string Symbol { get; set; }
//public string Price { get; set; }
string _price;
public string Price
{
set
{
if (_price != value)
{
_price = value;
OnPropertyChanged("Price");
}
}
get
{
return _price;
}
}
string _symbol;
public string Symbol
{
set
{
if (_symbol != value)
{
_symbol = value;
OnPropertyChanged("Symbol");
}
}
get
{
return _symbol;
}
}
string _image;
public string Image
{
set
{
if (_image != value)
{
_image = value;
OnPropertyChanged("Image");
}
}
get
{
return _image;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class PRICE
{
public string symbol { get; set; }
public string price { get; set; }
}
}
Best Regards,
Leon Lu
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.