【问题标题】:Picker function in Xamarin not showing itemsXamarin 中的选取器功能不显示项目
【发布时间】:2018-03-13 08:56:41
【问题描述】:

这是我的代码。

List<DriverStatusViewModel> driverStatus = PopulateDriverStatus();
            var selectedStatus = driverStatus.FirstOrDefault();

            var picker = new Picker { Title = "Select a status" };
            picker.SetBinding(Picker.ItemsSourceProperty, "driverStatus");
            picker.SetBinding(Picker.SelectedItemProperty, "selectedStatus");
            picker.ItemDisplayBinding = new Binding("Status");

填充列表

private List<DriverStatusViewModel> PopulateDriverStatus()
        {
            var driverStatus = new List<DriverStatusViewModel>();
            var stat1 = new DriverStatusViewModel();
            stat1.EnumId = 1;
            stat1.Status = "At Lunch";
            driverStatus.Add(stat1);
            var stat2 = new DriverStatusViewModel();
            stat2.EnumId = 2;
            stat2.Status = "Break";
            driverStatus.Add(stat2);
            var stat3 = new DriverStatusViewModel();
            stat3.EnumId = 3;
            stat3.Status = "Delivering";
            driverStatus.Add(stat3);
            return driverStatus;
        }

用于显示的 Xaml 代码

<Picker Title="Select a status"
                                ItemsSource="{Binding driverStatus}"
                                TextColor="Black"
                                BackgroundColor="Red"
                                ItemDisplayBinding="{Binding Name}"
                                SelectedItem="{Binding selectedStatus}" />

下图是在模拟器中运行时的样子

我对 Xamarin 很陌生,请帮助我,提前谢谢你。

【问题讨论】:

  • 您没有在任何驱动程序上设置 Name 属性?
  • 您是否正确设置了 ItemsSource?
  • 在您的代码中,您正在创建一个新的选择器,与 XAML 中的选择器不同。您需要在 xaml 中为您的选择器设置一个名称,通过定义x:Name="myPicker" 然后您可以使用myPicker.ItemsSource = driverStatus;从代码中访问
  • driverStatus 应该是带有 getter 和 setter 的属性: List DriverStatus {get;set;}
  • @JoeLv-MSFT 实际上我有不同的方法来解决它。谢谢你的时间和帮助我。真的很感激。

标签: c# xamarin xamarin.forms xamarin.android dropdown


【解决方案1】:

在 Xaml 中,添加 x:Name="pic":

<Picker Title="Select a monkey" 
        TextColor="Black"
        x:Name="pic"
        BackgroundColor="Red"
        ItemDisplayBinding="{Binding Name}"
        SelectedItem="{Binding selectedStatus}"/>

在你的页面中添加:

pic.ItemsSource = driverStatus;

【讨论】:

    【解决方案2】:

    问题是当您在代码中设置Binding 时,string 不能“指向”局部变量。绑定是在运行时评估的,因此视图模型中必须有一个名为 driverStatusselectedDriver 的属性。

    因此,与其将其设置为局部变量,不如创建两个属性DriverStatusSelectedDriver 并绑定到它们。此外,您可能还想使用INotifyPropertyChanged,以便在属性值更改时通知 UI。

    【讨论】:

      【解决方案3】:

      这就是我为解决 Picker 所做的。

      //视图模型

      public class DriverStatusViewModel : INotifyPropertyChanged
          {
              List<DriverStatus> statusList;
              public List<DriverStatus> StatusList
              {
                  get { return statusList; }
                  set
                  {
                      if (statusList != value)
                      {
                          statusList = value;
                          OnPropertyChanged();
                      }
                  }
              }
              public string Title { get; set; }
              DriverStatus selectedStatus;
              public DriverStatus SelectedStatus
              {
                  get { return selectedStatus; }
                  set
                  {
                      if (selectedStatus != value)
                      {
                          selectedStatus = 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 class DriverStatus
          {
              public int E_Id { get; set; }
              public string E_Name { get; set; }
          }
      

      //cs文件

      BindingContext = new DriverStatusViewModel
                  {
                      StatusList = PopulateDriverStatus()
                  };
      

      //为DriverStatus添加静态数据

      private List<DriverStatus> PopulateDriverStatus()
              {
                  var driverStatus = new List<DriverStatus>();
                  var stat1 = new DriverStatus();
                  stat1.E_Id = 1;
                  stat1.E_Name = "At Lunch";
                  driverStatus.Add(stat1);
                  var stat2 = new DriverStatus();
                  stat2.E_Id = 2;
                  stat2.E_Name = "Break";
                  driverStatus.Add(stat2);
                  var stat3 = new DriverStatus();
                  stat3.E_Id = 3;
                  stat3.E_Name = "Delivering";
                  driverStatus.Add(stat3);
                  return driverStatus;
              }
      

      //XAML 文件

      <Picker x:Name="picker" 
           Title="Select new status"
           TextColor="Black"
           HorizontalOptions="Start"
           ItemsSource="{Binding StatusList}"
           ItemDisplayBinding="{Binding E_Name}"
           SelectedItem="{Binding SelectedStatus}"/>
      
      <Label Text="{Binding SelectedStatus.E_Id}" IsVisible="False" x:Name="E_Id"/>
      

      特别感谢Xamarin Forms Picker Binding这个回答我跟着他做了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多