2017-08-23 177 views
0

我需要一些幫助與我的項目Xamarin形式 我想實現一個簡單的選擇器Xaml綁定到3個標籤,當我從選擇器中選擇一個值標籤將自動填充。 (數據來自SQLite)。 以下是我有: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"/> 

型號

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

public Jobs(){} 
} 

代碼背後:

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

我會選擇從選擇器(比如下拉)和填充標籤。 你們可以提供一些線索嗎? 預先感謝您的支持

桑托斯

回答

4

首先,有幾μm在你的代碼中。

1.當你通過循環(從db獲得的數據)時,選項總是用新數據更新(所以它使用最後一個對象生成),並將其設置爲BindingContext。你應該在這裏設置一個modelView而不是一個模型。

2. Picker的itemSource必須是list,但是您在此設置模型。

3.視圖模型必須實現INotifyPropertyChanged以通知更改。

我覺得你最需要理解的不是這個Picker,而是如何使用綁定。

Bindable Properties

Data Binding Basics

From Data Bindings to MVVM

好吧,讓我們回到這個情況。你需要的是here

我簡化了演示,你可以參考它。

  • 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"/> 
    
  • 模型和視圖模型

    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)); 
         } 
        } 
    } 
    
  • 代碼背後

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

我的測試:

enter image description here

+0

感謝科爾,這正是我一直在尋找。它像一個魅力一樣工作! – prezequias

+0

終於!一個Xamarin的例子,我第一次嘗試它! –

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"/> 

型號:

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

後面的代碼:

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

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

感謝Olexiy,你的答案是偉大的,以及 – prezequias