如何从 api 响应 Xamarin Forms 多次修改 ObservableCollection 中的数据
how to modify a data multiple times of in ObservableCollection from api response Xamarin Forms
我正在用 api 报告的响应填充 ObservableCollection
,并使用 Json 格式数组中的以下数据:
[
{
"date": "2021-06-08 11:46:55",
"product": "EXCHANGE",
"amount": 1,
"total": "90",
"points": "90",
"id": "5581"
},
{
"date": "2021-06-03 17:33:00",
"product": "GNV",
"amount": "80",
"total": "270",
"points": "27",
"id": 102959
},
]
“还有更多类似的数据,但我放了这 2 个例子是因为我收到的都是那种格式的”
所以我将数据添加到 ObservableCollection
public class WebApiClientService
{
private HttpClient _client;
public WebApiClientService()
{
_client = new HttpClient();
}
public async Task<T> CallPostTransactionsTask<T>(object objectParams)
{
Uri uri = new Uri(string.Format(Constants.urlTransactions));
try
{
var jsonData = JsonConvert.SerializeObject(objectParams);
var contentJson = new StringContent(jsonData, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsync(uri, contentJson);
if (response.IsSuccessStatusCode)
{
var jsonResult = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(jsonResult);
}
else
{
return default(T);
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
public class TransaccionesResponseModel
{
public DateTime date{ get; set; }
public string product{ get; set; }
public double amount{ get; set; }
public int total { get; set; }
public double points{ get; set; }
public int id { get; set; }
}
public class TransactionsPageViewModel : BaseViewModel
{
private WebApiClientService webApi = new WebApiClientService();
private ObservableCollection<TransaccionesResponseModel> listTransactions;
public ObservableCollection<TransaccionesResponseModel> ListTransactions
{
get
{
return this.listTransactions;
}
set
{
if (this.listTransactions == value)
{
return;
}
this.SetProperty(ref this.listTransactions, value);
}
}
public TransactionsPageViewModel()
{
CheckTransactions();
}
public async void CheckTransactions()
{
var transactionConsult = new
{
codeClient = "909090",
dateStart= "2021-02-01 00:00:00",
dateEnd= "2021-06-10 23:59:59"
};
ListTransactions= await webApi.CallPostTransactionsTask<ObservableCollection<TransaccionesResponseModel>>(transactionConsult);
}
}
并且在 XAML
<ContentPage.Content>
<StackLayout Padding="5">
<CollectionView ItemsSource="{Binding ListTransactions}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10,0" RowDefinitions="Auto, Auto">
<Frame
Padding="5"
BackgroundColor="White"
BorderColor="#C5740C"
CornerRadius="5"
IsClippedToBounds="False">
<Grid ColumnDefinitions="*,*">
<StackLayout Grid.Column="0">
<Label Text="Date:" />
<Label Text="Product:"/>
<Label Text="Amount:"/>
<Label Text="Points:" />
<Label Text="Id:" />
</StackLayout>
<StackLayout Grid.Column="1">
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding date, StringFormat='{0:dd/MM/yyyy HH:mm}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding product}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding amount, StringFormat='{0:#,0.#0}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding total, StringFormat='{0:#.00}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding points, StringFormat='{0:#,0.#0}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding id}" />
</StackLayout>
</Grid>
</Frame>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage.Content>
它是这样描绘我的:
date: 2021-06-08 11:46
product: EXCHANGE
amount: 1
total: 90
points: 90
id: 5581
date: 2021-06-03 17:33
product: GNV
amount: 80
total: 270
points: 27
id: 102959
现在我要增加一个符号-
到points: 90
每当:product: EXCHANGE
当每个product
等于EXCHANGE
时,我想这样得到结果:
date: 2021-06-08 11:46
product: EXCHANGE
amount: 1
total: 90
points: -90
id: 5581
使用 LINQ 获取匹配的交易
var match = myCollection.Where(x => x.product == "EXCHANGE").ToList();
然后更新匹配项
foreach (var m in match)
{
m.points = -90;
// modify any other properties here
}
我正在用 api 报告的响应填充 ObservableCollection
,并使用 Json 格式数组中的以下数据:
[
{
"date": "2021-06-08 11:46:55",
"product": "EXCHANGE",
"amount": 1,
"total": "90",
"points": "90",
"id": "5581"
},
{
"date": "2021-06-03 17:33:00",
"product": "GNV",
"amount": "80",
"total": "270",
"points": "27",
"id": 102959
},
]
“还有更多类似的数据,但我放了这 2 个例子是因为我收到的都是那种格式的”
所以我将数据添加到 ObservableCollection
public class WebApiClientService
{
private HttpClient _client;
public WebApiClientService()
{
_client = new HttpClient();
}
public async Task<T> CallPostTransactionsTask<T>(object objectParams)
{
Uri uri = new Uri(string.Format(Constants.urlTransactions));
try
{
var jsonData = JsonConvert.SerializeObject(objectParams);
var contentJson = new StringContent(jsonData, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsync(uri, contentJson);
if (response.IsSuccessStatusCode)
{
var jsonResult = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(jsonResult);
}
else
{
return default(T);
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
public class TransaccionesResponseModel
{
public DateTime date{ get; set; }
public string product{ get; set; }
public double amount{ get; set; }
public int total { get; set; }
public double points{ get; set; }
public int id { get; set; }
}
public class TransactionsPageViewModel : BaseViewModel
{
private WebApiClientService webApi = new WebApiClientService();
private ObservableCollection<TransaccionesResponseModel> listTransactions;
public ObservableCollection<TransaccionesResponseModel> ListTransactions
{
get
{
return this.listTransactions;
}
set
{
if (this.listTransactions == value)
{
return;
}
this.SetProperty(ref this.listTransactions, value);
}
}
public TransactionsPageViewModel()
{
CheckTransactions();
}
public async void CheckTransactions()
{
var transactionConsult = new
{
codeClient = "909090",
dateStart= "2021-02-01 00:00:00",
dateEnd= "2021-06-10 23:59:59"
};
ListTransactions= await webApi.CallPostTransactionsTask<ObservableCollection<TransaccionesResponseModel>>(transactionConsult);
}
}
并且在 XAML
<ContentPage.Content>
<StackLayout Padding="5">
<CollectionView ItemsSource="{Binding ListTransactions}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10,0" RowDefinitions="Auto, Auto">
<Frame
Padding="5"
BackgroundColor="White"
BorderColor="#C5740C"
CornerRadius="5"
IsClippedToBounds="False">
<Grid ColumnDefinitions="*,*">
<StackLayout Grid.Column="0">
<Label Text="Date:" />
<Label Text="Product:"/>
<Label Text="Amount:"/>
<Label Text="Points:" />
<Label Text="Id:" />
</StackLayout>
<StackLayout Grid.Column="1">
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding date, StringFormat='{0:dd/MM/yyyy HH:mm}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding product}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding amount, StringFormat='{0:#,0.#0}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding total, StringFormat='{0:#.00}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding points, StringFormat='{0:#,0.#0}'}" />
<Label
BackgroundColor="Transparent"
HorizontalTextAlignment="End"
Text="{Binding id}" />
</StackLayout>
</Grid>
</Frame>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage.Content>
它是这样描绘我的:
date: 2021-06-08 11:46
product: EXCHANGE
amount: 1
total: 90
points: 90
id: 5581
date: 2021-06-03 17:33
product: GNV
amount: 80
total: 270
points: 27
id: 102959
现在我要增加一个符号-
到points: 90
每当:product: EXCHANGE
当每个product
等于EXCHANGE
时,我想这样得到结果:
date: 2021-06-08 11:46
product: EXCHANGE
amount: 1
total: 90
points: -90
id: 5581
使用 LINQ 获取匹配的交易
var match = myCollection.Where(x => x.product == "EXCHANGE").ToList();
然后更新匹配项
foreach (var m in match)
{
m.points = -90;
// modify any other properties here
}