【问题标题】:Adding key values for items in picker在选择器中为项目添加键值
【发布时间】:2016-05-06 10:53:41
【问题描述】:

我正在使用 XAMARIN 选择器来选择一个国家/地区。国家/地区在选择器中是硬编码的。有没有一种方法可以通过键值识别每个国家/地区名称。我使用 SAPUI5 以类似的方式完成了此操作。

<core:Item key="AF" text="Afghanistan  " />
<core:Item key="AL" text="Albania  " />
<core:Item key="DZ" text="Algeria  " />
<core:Item key="VI" text="Amer.Virgin Is. " />

同样,我有没有办法在 XAMARIN 表单选择器中为每个国家/地区添加一个键值?

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    有一种使用数据绑定在选取器中使用键值对的方法。

    首先,您必须在表单的视图模型中定义字典并定义一个返回字典键值对列表的属性。还需要绑定到当前选定的项目:

    class MyViewModel
    {
      ...
      private Dictionary<string, string> PickerItems = 
        new Dictionary<string, string>() { {"AF", "Afghanistan"}, {"AL", "Albania" } };
    
      public List<KeyValuePair<string, string>> PickerItemList
      {
          get => PickerItems.ToList();
      }
    
      private KeyValuePair<string, string> _selectedItem;
      public KeyValuePair<string, string> SelectedItem
      {
          get => _selectedItem;
          set => _selectedItem = value;
      }
      ...
    }
    

    其次,您必须在 Pickers 定义中设置 Pickers ItemsSource、ItemDisplayBinding 和 SelectedItem 绑定:

    <Picker
        ItemDisplayBinding="{Binding Value}"
        ItemsSource="{Binding PickerItemList}"
        SelectedItem="{Binding SelectedItem}" />
    

    鉴于此,您可以通过

    获取视图模型中所选项目的键
    SelectedItem.Key
    

    延伸阅读:https://developer.xamarin.com/guides/xamarin-forms/user-interface/picker/populating-itemssource/#Populating_a_Picker_with_Data_Using_Data_Binding

    【讨论】:

    • 优秀的代码示例。仍在尝试完全理解这一切是如何协同工作的,但我能找到最简单的例子。对于其他可能想要这样做的人,我可以很容易地访问后面代码中 SelectedItem 的键和值。
    • 将此属性添加到 xaml 中的选取器中,然后命名任何方法。 在 xaml.cs 中调用该方法 public void OnPickerChangedEvent(object sender, EventArgs e) { var picker = (Picker)sender; var myIndex = picker.SelectedIndex; var myData = this.MyViewModel.SelectedItem.Key; }
    • 优秀、简单的示例,干净的代码直接解决了这个问题。谢谢你的出现;这应该是公认的答案
    【解决方案2】:

    不,Key 属性在 xamarin 选择器中可用。 但是,您可以使用 Dictionary 类和 xamarin 选择器类的 SelectedIndex 属性来实现它。

    使用以下代码 sn-p 实现它:

    class PickerDemoPage : ContentPage
            {
                // Dictionary to get Color from color name.
                Dictionary<string, Color> nameToColor = new Dictionary<string, Color>
                {
                    { "Aqua", Color.Aqua }, { "Black", Color.Black },
                    { "Blue", Color.Blue }, { "Fuschia", Color.Fuschia },
                    { "Gray", Color.Gray }, { "Green", Color.Green },
                    { "Lime", Color.Lime }, { "Maroon", Color.Maroon },
                    { "Navy", Color.Navy }, { "Olive", Color.Olive },
                    { "Purple", Color.Purple }, { "Red", Color.Red },
                    { "Silver", Color.Silver }, { "Teal", Color.Teal },
                    { "White", Color.White }, { "Yellow", Color.Yellow }
                };
    
                public PickerDemoPage()
                {
                    Label header = new Label
                    {
                        Text = "Picker",
                        FontSize = Device.GetNamedSize (NamedSize.Large, typeof(Label)),
                        HorizontalOptions = LayoutOptions.Center
                    };
    
                    Picker picker = new Picker
                    {
                        Title = "Color",
                        VerticalOptions = LayoutOptions.CenterAndExpand
                    };
    
                    foreach (string colorName in nameToColor.Keys)
                    {
                        picker.Items.Add(colorName);
                    }
    
                    // Create BoxView for displaying picked Color
                    BoxView boxView = new BoxView
                    {
                        WidthRequest = 150,
                        HeightRequest = 150,
                        HorizontalOptions = LayoutOptions.Center,
                        VerticalOptions = LayoutOptions.CenterAndExpand
                    };
    
                    picker.SelectedIndexChanged += (sender, args) =>
                        {
                            if (picker.SelectedIndex == -1)
                            {
                                boxView.Color = Color.Default;
                            }
                            else
                            {
                                string colorName = picker.Items[picker.SelectedIndex];
                                boxView.Color = nameToColor[colorName];
                            }
                        };
    
                    // Accomodate iPhone status bar.
                    this.Padding = new Thickness(10, Device.OnPlatform(20, 0, 0), 10, 5);
    
                    // Build the page.
                    this.Content = new StackLayout
                    {
                        Children =
                        {
                            header,
                            picker,
                            boxView
                        }
                    };
    
                }
            }
    

    来源:https://developer.xamarin.com/api/type/Xamarin.Forms.Picker/

    【讨论】:

      【解决方案3】:

      我刚刚遇到同样的问题,我找到了解决方法。我只需要将选择器与SomeClass 元素列表绑定。这是我所做的:

      namespace MyApp.ViewModels 
      {
          public class CboViewModel 
          {
              public int Id { get; set; }
              public string Name { get; set; }
          }
      }
      

      然后在我的XAML 文件中:

      <ContentPage ...
          xmlns:vm="clr-namespace:MyApp.ViewModels;assembly=Myapp" >
          <ContentPage.Content>
              ...
              <Picker x:Name="pckStatus" HorizontalOptions="FillAndExpand" >
                  <Picker.ItemsSource>
                      <x:Array Type="{x:Type vm:CboViewModel}" >
                          <vm:CboViewModel Id="0" Name="All" />
                          <vm:CboViewModel Id="1" Name="New" />
                          <vm:CboViewModel Id="2" Name="Standby" />
                          <vm:CboViewModel Id="4" Name="In Progress" />
                          <vm:CboViewModel Id="8" Name="Submitted" />
                          <vm:CboViewModel Id="16" Name="Closed" />
                      </x:Array>
                  </Picker.ItemsSource>
                  <Picker.ItemDisplayBinding>
                      <Binding Path="Name" />
                  </Picker.ItemDisplayBinding>
                  <Picker.SelectedIndex>0</Picker.SelectedIndex>
              </Picker>
              ...
          <ContentPage.Content>
      </ContentPage>
      

      【讨论】:

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