Xamarin Forms Picker 的默认值

3

我希望在打开页面时获取第一条数据,但实际上并没有获取到。我不知道自己哪里出了错。有谁能帮忙吗?

以下是我的代码:

Xaml

<Picker FontSize="15"
        SelectedItem="{Binding SelectedObject}"
        VerticalOptions="StartAndExpand"
        HorizontalOptions="FillAndExpand"
        ItemsSource="{Binding myList}"
        ItemDisplayBinding="{Binding Title}">

视图模型


public myViewModel()
{
    GetList();
    SelectedObject = myList[0];
}



public myClass _selectedObject;

public myClass SelectedObject
{
    get
    {
        return _selectedObject;
    }
    set
    {
        _selectedObject= value;
        OnPropertyChanged("SelectedObject");

    }
}

public class myClass
{
   public int ID { get; set; }

   public string Title{ get; set; }

   public string Desc{ get; set; }
}

获取第一条数据是什么意思?让选择器选中第一行吗?还是获取选择器中第一行的值?或者其他什么意思? - nevermore
我是指选择第一行。 - YasinGundogdu
你好,你想让选择器上的第一项在未选择时就显示出来吗?这是你的意思吗? - Anand
是的,我想要完全那样做。 - YasinGundogdu
2个回答

4
<Picker.SelectedIndex>0</Picker.SelectedIndex>

或者

SelectedIndex="{Binding Index}"

或者交换您的属性顺序。
<Picker FontSize="15"
    VerticalOptions="StartAndExpand"
    HorizontalOptions="FillAndExpand"
    ItemsSource="{Binding myList}"
    ItemDisplayBinding="{Binding Title}"
    SelectedItem="{Binding SelectedObject}>

2
如果您交换属性的顺序,确保SelectedItem是最后一个,那么这应该(几乎肯定)可以工作。 - Julio E. Rodríguez Cabañas
我不完全理解你的意思。如果您能分享一段示例代码,我会更好地理解。 - YasinGundogdu
2
交换SelectedItem的顺序解决了我的问题。 - user4108368
尽管我按照建议更改了属性顺序,但仍无法使默认选择起作用。然而,我考虑使用Title属性来设置默认选择,以便在UI中显示正确(确实选择了正确的对象,因此Title只是为了UI)。 - Vering
"{Binding SelectedObject}" 是应用程序自动知道的内容,还是我需要声明/创建一个同名的东西?这是什么? - GuidoG

2

我写了一个演示,并且使它正常工作,你可以检查一下并找出你犯的错误:

在后台代码中:

Original Answer翻译成:"最初的回答"

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();


        myViewModel vm = new myViewModel();
        this.BindingContext = vm;

        //This will also work
        //myPicker.SelectedIndex = 0;
    }
}

public class myViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public List<myClass> myList
    {
        get;
        set;
    }

    public myViewModel()
    {
        GetList();
        SelectedObject = myList[0];
    }

    public void GetList() {

        myList = new List<myClass>();

        myList.Add(new myClass(1,"firstTitle","FirstDesc"));
        myList.Add(new myClass(2, "SecondTitle", "SecondDesc"));
        myList.Add(new myClass(3, "ThirdTitle", "ThirdDesc"));

    }

    public myClass _selectedObject;


    public myClass SelectedObject
    {
        get
        {
            return _selectedObject;
        }
        set
        {
            _selectedObject = value;

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedObject"));
        }
    }
}

public class myClass
{
    public int ID { get; set; }

    public string Title { get; set; }

    public string Desc { get; set; }

    public myClass(int a , string title , string desc) {

        ID = a;
        Title = title;
        Desc = desc;
    }
}

"最初的回答":在Xaml中可以这样写:
    <!-- Place new controls here -->
<Picker x:Name="myPicker" FontSize="15"
        BackgroundColor="Red"
    VerticalOptions="CenterAndExpand"
    HorizontalOptions="CenterAndExpand"
    ItemsSource="{Binding myList}"
    ItemDisplayBinding="{Binding Title}"
    SelectedItem="{Binding SelectedObject}"
        />

我在这里上传了我的示例请告诉我它是否有效。原始答案被翻译为“最初的回答”。

谢谢Jack Hua。"myPicker.SelectedIndex = 0;"对我有用。 - YasinGundogdu
1
@YasinGundogdu 如果这个答案对您有帮助,您可以接受它吗? - nevermore
{Binding SelectedObject} 是应用程序自动识别的内容,还是我需要声明/创建一个名称为此的内容?这是什么意思? - GuidoG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接