【问题标题】:Xamarin Forms Picker BindingXamarin 表单选择器绑定
【发布时间】:2018-02-01 15:24:33
【问题描述】:

我想实现一个简单的选择器 XAML 绑定到 3 个标签,当我从选择器中选择一个值时,标签将自动填充(数据来自 SQLite)。 这是我所拥有的:

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

我会从选择器(如下拉菜单)中进行选择并填充标签。

【问题讨论】:

    标签: c# visual-studio xamarin xamarin.forms


    【解决方案1】:

    首先,您的代码中有一些错误。

    1.当您通过循环(从 db 获得的数据)时,选项总是使用新数据更新(因此它使用最后一个对象生成),并将其设置为 BindingContext。你应该在这里设置一个模型视图而不是一个模型。

    2.Picker的itemSource必须是list,但是你在这里设置一个模型。

    3.viewmodel 必须实现INotifyPropertyChanged 来通知更改。

    我觉得你最需要了解的不是这个 Picker ,而是 How to work with binding。

    Bindable Properties

    Data Binding Basics

    From Data Bindings to MVVM

    好的,让我们回到这个案例。你需要的是here

    我简化了demo,大家可以参考一下。

    • XAML

      <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();
       }
      
    • 我的测试:

    【讨论】:

    • 谢谢科尔,这正是我想要的。它就像一个魅力!
    • 终于!我第一次尝试就可以使用的 Xamarin 示例!
    • 第一次尝试确实有效,请问如何设置默认的SelectedItem?非常感谢
    • @Jen143 您可以在创建 BindingContext 时设置它。 this.BindingContext = new RootModel{JobList = GetJobsInfo();SelectedJob = JobList [0];};
    • 那么在同一个视图中的第二个选择器呢?
    【解决方案2】:

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

    【讨论】:

    • 感谢 Olexiy,您的回答也很棒
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 2020-01-15
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多