web-dev-qa-db-ja.com

Xamarinフォームピッカーバインディング

Xamarinフォーム上のプロジェクトでいくつかの助けが必要です。3つのラベルにバインドされた単純なピッカーXamlを実装したいと思います。ピッカーから値を選択すると、ラベルが自動的に入力されます。 (データは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();
        }

ピッカー(ドロップダウンなど)から選択してラベルを入力します。手がかりはありますか?よろしくお願いします

サントス

5
prezequias

まず、コードに誤りがあります。

1.ループ(dbから取得したデータ)を実行すると、オプションは常に新しいデータで更新され(最後のオブジェクトを使用して生成されるため)、BindingContextに設定します。ここではモデルではなく、modelViewを設定する必要があります。

2. PickerのitemSourceはlistでなければなりませんが、ここでモデルを設定します。

3.変更を通知するには、viewmodelがINotifyPropertyChangedを実装する必要があります。

あなたが最も理解する必要があるのはこのピッカーではなく、バインディングの操作方法です。

バインド可能なプロパティ

データバインディングの基本

データバインディングからMVVMへ

さて、このケースに戻ってみましょう。必要なものは ここ

デモを簡略化しましたので、参照してください。

  • 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"/>
    
  • モデルとViewModel:

    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

17
Cole Xia - MSFT

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