我有一个使用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函数中的分配不适用于我。
答案 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.