2017-08-23 5 views
0

Ich brauche etwas Hilfe mit meinem Projekt auf Xamarin Forms Ich würde gerne eine einfache Picker Xaml binded mit 3 Etiketten, wo, wenn ich einen Wert aus dem Picker die Etiketten automatisch gefüllt werden. (Daten stammen von SQLite). Hier ist, was ich habe:Xamarin Forms Picker Binding

<Picker x:Name="ListJobs" Title="Select Job" ItemsSource="{Binding options}" ItemDisplayBinding="{Binding JobNo}" SelectedItem="{Binding SelectedJobs}"/> 

<Label Text="{Binding JobsId}" IsVisible="True" x:Name="TxtId"/> 
<Label Text="{Binding name}" IsVisible="True" x:Name="TxtName"/> 
<Label Text="{Binding location}" IsVisible="True" x:Name="TxtLoc"/> 

Modell

public class Jobs 
{ 
public string JobsId {get;set;} 
public string name {get;set;} 
public string location {get;set;} 

public Jobs(){} 
} 

-Code Behind:

protected override OnAppearing() 
{ 
jobsInfo = (List<Jobs>) GetJob(); 
foreach (var item in jobsInfo) 
{ 
    Jobs options = new Jobs 
{ 
    JobsId = item.JobsId, 
    name = item.name, 
    location = item.location 
}; 
BindingContext = options; 
} 
} 
private IEnumerable<Jobs> GetJobsInfo() 
     { 
      var db = _connection.Table<Jobs>(); 
      return db.ToList(); 
     } 

ich von Picker (wie Drop-Down) auswählen würde und die Etiketten füllen. Kannst du etwas Hinweise geben? Vielen Dank im Voraus für Ihre Unterstützung

Santos

Antwort

4

Erstens gibt es einige m ist in Ihrem Code enthalten.

1.Wenn Sie die Schleife durchlaufen (die Daten, die Sie aus db gewonnen haben), werden die Optionen immer mit neuen Daten aktualisiert (also mit dem letzten Objekt erzeugt) und Sie setzen sie auf BindingContext. Sie sollten hier ein ModelView eher ein Modell setzen.

2.Die itemSource von Picker muss eine list sein, jedoch haben Sie hier ein Modell festgelegt.

3. Das Viewmodel muss INotifyPropertyChanged implementieren, um die Änderungen zu melden.

Ich denke, was Sie am meisten Verständnis brauchen, ist nicht dieser Picker, es ist, wie man mit Bindung arbeitet.

Bindable Properties

Data Binding Basics

From Data Bindings to MVVM

Okay, lassen Sie uns auf diesen Fall zurückkommen. Was Sie brauchen, ist here

Ich vereinfachte die Demo und Sie können sich darauf beziehen.

  • xMAL

    <Picker x:Name="picker" 
         Title="Select Job" 
         ItemsSource="{Binding JobList}" 
         ItemDisplayBinding="{Binding Name}" 
         SelectedItem="{Binding SelectedJob}"/> 
    
    <Label Text="{Binding SelectedJob.JobsId}" IsVisible="True" x:Name="TxtId" Margin="0,100,0,0"/> 
    <Label Text="{Binding SelectedJob.Name}" IsVisible="True" x:Name="TxtName"/> 
    <Label Text="{Binding SelectedJob.Location}" IsVisible="True" x:Name="TxtLoc"/> 
    
  • Modell und Ansichtsmodell

    public class Jobs 
    { 
        public string JobsId { get; set; } 
        public string Name { get; set; } 
        public string Location { get; set; } 
    } 
    
    public class RootModel : INotifyPropertyChanged 
    { 
    
        List<Jobs> jobList; 
        public List<Jobs> JobList 
        { 
         get { return jobList; } 
         set 
         { 
          if (jobList != value) 
          { 
           jobList = value; 
           OnPropertyChanged(); 
          } 
         } 
        } 
    
        Jobs selectedJob; 
        public Jobs SelectedJob 
        { 
         get { return selectedJob; } 
         set 
         { 
          if (selectedJob != value) 
          { 
           selectedJob = value; 
           OnPropertyChanged(); 
          } 
         } 
        } 
    
    
        public event PropertyChangedEventHandler PropertyChanged; 
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
        { 
         PropertyChangedEventHandler handler = PropertyChanged; 
         if (handler != null) 
         { 
          handler(this, new PropertyChangedEventArgs(propertyName)); 
         } 
        } 
    } 
    
  • -Code hinter

    public MainPage() 
    { 
         InitializeComponent(); 
    
         this.BindingContext = new RootModel 
         { 
          JobList = GetJobsInfo() 
         }; 
    } 
    
    private List<Jobs> GetJobsInfo() 
    { 
         var db = _connection.Table<Jobs>(); 
         return db.ToList(); 
    } 
    

My Test:

enter image description here

+0

Dank Cole, das ist genau das, was ich suchte. Es hat funktioniert wie ein Zauber! – prezequias

+0

Endlich! Ein Xamarin-Beispiel, das beim ersten Mal funktioniert! –

1

XAML:

<Picker x:Name="ListJobs" Title="Select Job" ItemsSource="{Binding AllJobs}" 
     ItemDisplayBinding="{Binding Name}" SelectedItem="{Binding SelectedJob}"/> 
<Label Text="{Binding SelectedJob.JobId}" IsVisible="True" x:Name="TxtId"/> 
<Label Text="{Binding SelectedJob.Name}" IsVisible="True" x:Name="TxtName"/> 
<Label Text="{Binding SelectedJob.Location}" IsVisible="True" x:Name="TxtLoc"/> 

Modell:

public class Job 
{ 
    public string JobId { get; set; } 
    public string Name { get; set; } 
    public string Location {get; set; } 
} 

public class JobModel 
{ 
    public List<Job> AllJobs { get; set; } 
    public Job SelectedJob { get; set; } 
} 

-Code hinter:

protected override OnAppearing() 
{ 
    BindingContext = new JobsModel { 
     AllJobs = GetJobs() 
    }; 
} 

private List<Jobs> GetJobs() 
{ 
    var db = _connection.Table<Jobs>(); 
    return db.ToList(); 
} 
+0

Dank Olexiy, Ihre Antwort ist auch sehr gut – prezequias

Verwandte Themen