2017-09-05 71 views
2

Xamarin Pickerをバインドする際に問題があります。選択したアイテムを変更すると、フォームがリフレッシュされます。コードビハインドでXAMLを使用しています。Xamarin PickerへのバインドXAMLのSelectedItemがリロードされていない

ここにXAMLがあります。ピッカーが定義されているのがわかります。データはそれに拘束されており、My ListからNameプロパティをロードしています。

この上にID「エントリ」フィールドがあり、これは機能していない部分です。私がしたいことは、ピッカーが "選択"されたときにリスト/選択されたリスト項目からIDフィールドを表示することです。

オンラインで見つかったいくつかのサンプルコードもあります。SurnameとForenameは両方とも、データ入力時に対応するラベルを更新しています。だから、それはPickerと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; 
     } 
    } 
} 

私は数日間これを解読しようとしてきましたが、それを機能させるようには見えません。

答えて

3

私が見ることができるところから、あなたはIdの値を設定していません。おそらくあなたはRacesIndexのセッターに入れたいと思うでしょう。また、RacesIndexはSelectedItemではなくSelectedIndexにバインドする必要があります。私はRaceクラスがintであるIdプロパティを持っていると仮定しますので、以下を見てください。 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"); 
     } 
    } 
} 
+0

優れています。 –

関連する問題