【问题标题】:Binding to Xamarin Picker SelectedItem in XAML not Reloading Form绑定到 XAML 中的 Xamarin Picker SelectedItem 不重新加载表单
【发布时间】:2017-09-05 01:14:03
【问题描述】:

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

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

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

还有一些我在网上找到的示例代码有效 - 输入数据时,姓氏和名字都会更新相应的标签。所以它必须与选择器和 SelectedItem 绑定或我尝试使用 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;
        }
    }
}

有什么想法吗?这几天我一直在尝试破解这个问题,但似乎无法让它工作。

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms


    【解决方案1】:

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

     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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2017-11-18
      • 2023-04-04
      • 2018-11-15
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多