选取器不显示先前的选择

时间:2018-03-06 18:13:12

标签: c# xamarin xamarin.forms xamarin.ios

我正在关注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上的选择器。 enter image description here

当我离开我的应用中的另一个页面,然后返回“设置”页面时,这就是我所看到的。 enter image description here

1 个答案:

答案 0 :(得分:1)

您的代码与教程中的代码之间的一个重要区别是,教程中的代码为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绑定中显示的同一集合中返回一个对象,而不是具有相同值但来自不同集合的对象。