2017-08-23 179 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