页面打开时如何在Xamarin选择器中设置SelectedItem

时间:2018-07-26 14:24:20

标签: xamarin xamarin.forms prism

我有一个使用XamarinForms和Prism MVVM的小项目。 在设置页面上,我从选择器中保存作者的ID。 当我返回到设置页面时,我希望在选择器中默认选择该作者。

这是我在Xaml中的选择器:

       <Picker x:Name="authorPicker" Title="Select Author" FontSize="Medium"
                HorizontalOptions="StartAndExpand" VerticalOptions="Center" 
                ItemsSource="{Binding NoteAuthors}"
                ItemDisplayBinding="{Binding Name}"
                SelectedItem="{Binding SelectedAuthor, Mode=TwoWay}"
                Grid.Row="0" Grid.Column="1" />

当选择“作者”时,我在ViewModel中得到了它,并且工作正常:

    private NoteAuthor _selectedAuthor;
    public NoteAuthor SelectedAuthor
    {
        get { return _selectedAuthor; }
        set
        {   if (_selectedAuthor != value)
            {
                SetProperty(ref _selectedAuthor, value);
            }
        }
    }

在ViewModel> OnNavigatingTo函数中,我调用GetAuthor函数,该函数根据先前保存的ID返回Author。

    public async void GetAuthor(int author_id)
    {
        NewNoteAuthor = await App.Database.GetAuthorById(author_id);
        if(NewNoteAuthor != null && NewNoteAuthor.ID > 0)
        {
            SelectedAuthor = NewNoteAuthor;
        }
    }

页面打开后,如何“跳到”该作者? GetAuthor函数中的分配不适用于我。

1 个答案:

答案 0 :(得分:3)

从数据库中检索NoteAuthors后,必须通过引用其中之一来设置SelectedAuthor。 Picker使用引用相等性,因此从GetAuthor中的数据库中加载作者的另一个实例完全无效。遵循代码可以解决此问题,并且还可以提高代码的性能。

NoteAuthors = await // read them from db ...
SelectedAuthor = NoteAuthors.SingleOrDefault(a => a.Id == author_id); // don't load it from database again.