选取器不显示先前的选择
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选取器不显示先前的选择相关的知识,希望对你有一定的参考价值。
我正在关注Xamarin Forms的Bindable Picker上的this教程。我在教程中一直都是这样做的,但是一旦我离开并回到我的设置页面,我就无法显示上一个选择。
Settings.cs
public static double DistancePreferences
{
get { return AppSettings.GetValueOrDefault(nameof(DistancePreferences), 32.2); }
set { AppSettings.AddOrUpdateValue(nameof(DistancePreferences), value); }
}
DistanceItem类
public class DistanceItem
{
public string Display { get; set; }
public double Kilometers { get; set; }
public static List<DistanceItem> All
{
get
{
return new List<DistanceItem>
{
new DistanceItem { Display="1 mile", Kilometers=1.6 },
new DistanceItem { Display="2 miles", Kilometers=3.2 },
new DistanceItem { Display="5 miles", Kilometers=8.0 },
new DistanceItem { Display="10 miles", Kilometers=16.1 },
new DistanceItem { Display="20 miles", Kilometers=32.2 },
new DistanceItem { Display="50 miles", Kilometers=80.5 },
new DistanceItem { Display="100 miles", Kilometers=160.9 }
};
}
}
}
来自SettingsPage.xaml的选择器
<Picker x:Name="disPicker" ItemsSource="{x:Static distance:DistanceItem.All}" ItemDisplayBinding="{Binding Display}" SelectedItem="{Binding DistanceSelection, Mode=TwoWay}"/>
SettingsViewModel.xaml
public DistanceItem DistanceSelection
{
get
{
var distance = Settings.DistancePreferences;
var item = DistanceItem.All.Find(x => x.Kilometers.Equals(Settings.DistancePreferences));
return item;
}
set
{
// Saving the km from the selection for later
Settings.DistancePreferences = value.Kilometers;
}
}
这是我的ios sim上的选择器。
答案
您的代码与教程中的代码之间的一个重要区别是,教程中的代码为All创建了一个集合,并在每次调用getter时返回。每次调用getter时,您的代码都会创建一个新集合。
将DistanceItem.All的实现更改为:
private static List<DistanceItem> _all;
public static List<DistanceItem> All
{
get
{
if (_all == null)
{
_all = new List<DistanceItem>
{
new DistanceItem { Display="1 mile", Kilometers=1.6 },
new DistanceItem { Display="2 miles", Kilometers=3.2 },
new DistanceItem { Display="5 miles", Kilometers=8.0 },
new DistanceItem { Display="10 miles", Kilometers=16.1 },
new DistanceItem { Display="20 miles", Kilometers=32.2 },
new DistanceItem { Display="50 miles", Kilometers=80.5 },
new DistanceItem { Display="100 miles", Kilometers=160.9 }
};
}
return _all;
}
}
这将确保DistanceSelection从Picker从其ItemsSource绑定中显示的同一集合中返回一个对象,而不是具有相同值但来自不同集合的对象。
以上是关于选取器不显示先前的选择的主要内容,如果未能解决你的问题,请参考以下文章