gpt4 book ai didi

c# - 绑定(bind)到 XAML 中的 Xamarin Picker SelectedItem 而不是重新加载表单

转载 作者:行者123 更新时间:2023-11-30 15:56:51 26 4
gpt4 key购买 nike

我在绑定(bind)我的 Xamarin Picker 时遇到了一些困难,因此当我更改所选项目时,它会触发我的表单刷新。我正在使用带有代码隐藏的 XAML。

这是 XAML。您可以看到已定义的 Picker。数据很好地绑定(bind)到它,它正在从我的列表中加载 Name 属性。

它上面有一个 Id“Entry”字段,这是不起作用的部分。我想要做的是在选择器被“选择”时显示列表/选定列表项中的 Id 字段。

还有一些我在网上找到的有效示例代码 - 输入数据时,姓氏和名字都会更新相应的标签。因此,这一定与选择器和 SelectedItem 绑定(bind)有关,或者与我尝试使用 OnPropertyChanged 的​​方式有关。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TechsportiseApp.MainUI.Races">
<StackLayout Padding="0,20,0,0">
<Label Text="Race ID" />
<Entry Text="{Binding Id}" />
<Picker ItemsSource="{Binding RaceList}" ItemDisplayBinding="{Binding Name}" SelectedItem="{Binding RacesIndex, Mode=TwoWay}" />
<Label Text="Data Binding 101 Demo" FontAttributes="Bold" HorizontalOptions="Center" />
<Label Text="Forename:" />
<Entry Text="{Binding Forename, Mode=TwoWay}" />
<Label Text="Surname:" />
<Entry Text="{Binding Surname, Mode=TwoWay}" />
<Label Text="Your forename is:" />
<Label Text="{Binding Forename}" />
<Label Text="Your surname is:" />
<Label Text="{Binding Surname}" />
</StackLayout>
</ContentPage>

我正在使用的 ViewModel 如下所示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestSharp;
using TechsportiseApp.API.Models;
using Xamarin.Forms;
using TechsportiseApp.API;

namespace TechsportiseApp.MainUI.Models
{
public class RacesViewModel : INotifyPropertyChanged
{
int _id;
public int Id
{
get
{
return _id;
}
set
{
if (_id != value)
{
_id = value;
OnPropertyChanged("Id");
}
}
}
string _name;
public string Name
{
get
{
return _name;
}
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}

public List<Race> RaceList
{
get
{
var racelist = RacesAPI.GetRaces();
return racelist;
}
}

int _racesIndex;
public int RacesIndex
{
get
{
return _racesIndex;
}
set
{
if (_racesIndex != value)
{
_racesIndex = value;

// trigger some action to take such as updating other labels or fields
OnPropertyChanged("RacesIndex");
}
}
}

string forename, surname;

public string Forename
{
get
{
return forename;
}
set
{
if (forename != value)
{
forename = value;
OnPropertyChanged("Forename");
}
}
}

public string Surname
{
get
{
return surname;
}
set
{
if (surname != value)
{
surname = value;
OnPropertyChanged("Surname");
}
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
var changed = PropertyChanged;
if (changed != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

如果需要,这里是我用来填充列表数据的代码,我是从 API 的 JSON 响应中获取的。

using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Text;
using TechsportiseApp.API.Models;
using TechsportiseApp.MainUI;
using Xamarin.Forms;

namespace TechsportiseApp.API
{
public class RacesAPI
{
public static List<Race> GetRaces()
{
var raceList = new List<Race>();
string APIServer = Application.Current.Properties["APIServer"].ToString();
string Token = Application.Current.Properties["Token"].ToString();
var client = new RestClient(APIServer);
var request = new RestRequest("api/race", Method.GET);
request.AddHeader("Content-type", "application/json");
request.AddHeader("Authorization", "Bearer " + Token);
var response = client.Execute(request) as RestResponse;
raceList = JsonConvert.DeserializeObject<List<Race>>(response.Content);
return raceList;
}
}
}

有什么想法吗?几天来我一直在尝试破解它,但似乎无法让它发挥作用。

最佳答案

据我所知,您绝不会设置 Id 的值。可能您想将它放在 RacesIndex 的 setter 中。此外,RacesIndex 应该绑定(bind)到 SelectedIndex,而不是 SelectedItem。我假设 Race 类有一个 Id 属性,它是一个 int,所以请看下面的内容。如果你想绑定(bind)到selectedItem,那么你绑定(bind)的属性应该和列表中的类型相同

 int _racesIndex;
public int RacesIndex
{
get
{
return _racesIndex;
}
set
{
if (_racesIndex != value)
{
_racesIndex = value;

// trigger some action to take such as updating other labels or fields
Id = racelist[value].RaceId;
OnPropertyChanged("RacesIndex");
}
}
}

关于c# - 绑定(bind)到 XAML 中的 Xamarin Picker SelectedItem 而不是重新加载表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045713/

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