【问题标题】:Xamarin Forms Default value for Picker选择器的 Xamarin 表单默认值
【发布时间】:2019-05-21 13:36:39
【问题描述】:

我想在打开页面时获取第一个数据,但没有。我不知道我在哪里犯了错误。有人可以帮忙吗?

这是我的代码;

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

【问题讨论】:

  • 获取第一个数据是什么意思?让picker选择第一行?或者获取 Picker 中第一行的值?还是其他?
  • 我的意思是选择第一行。
  • 您好,您希望第一个项目显示在选取器上而不选择它吗?是这个意思吗?
  • 是的,我就是这么想的。

标签: xamarin mvvm xamarin.forms picker


【解决方案1】:
<Picker.SelectedIndex>0</Picker.SelectedIndex>

SelectedIndex="{Binding Index}"

或者交换你的属性顺序

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

【讨论】:

  • 如果您交换属性的顺序以确保 SelectedItem 是最后一个,这应该(几乎可以肯定)有效。
  • 我不完全明白你的意思。如果您分享示例代码,我会更好地理解。
  • 交换 SelectedItem 的顺序解决了我的问题。
  • 我仍然无法使默认选择起作用,即使我按照建议切换了属性顺序。但是,我考虑使用 Title 属性作为默认选择,以便它在 UI 中看起来正确(确实选择了正确的对象,因此 Title 仅适用于 UI)
  • {Binding SelectedObject} 应用程序自动知道的东西,还是我应该用这个名称声明/创建一些东西?这是什么?
【解决方案2】:

我只是写了一个demo,我成功了,你可以检查一下,找出你哪里出错了:

在后面的代码中:

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}"
        />

我上传了我的示例here。让我知道它是否有效。

【讨论】:

  • 谢谢杰克华。 “myPicker.SelectedIndex = 0;”这对我有用。
  • @YasinGundogdu 如果对你有帮助,你能接受这个答案吗?
  • {Binding SelectedObject} 应用程序自动知道的东西,还是我应该用这个名称声明/创建一些东西?这是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2021-04-18
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多