为什么选取器 (Xamarin.Forms) 中的项在引发 PropertyChanged 后没有更新?



我已经设置了一个 Picker,以便显示每个项目的随机数(通过转换器(。我还添加了一个按钮,该按钮将PropertyChanged事件提高在列表中,以便将项目显示为新的随机数。但是,即使 PropertyChanged事件正在增加,这些项目似乎也没有更新。

这是带有PickerButton的XAML布局:

<StackLayout>
    <Picker
        ItemsSource="{Binding MyList}"
        ItemDisplayBinding="{Binding ., Converter={StaticResource MyConverter}}"
        />
    <Button
        Command="{Binding RefreshCommand}"
        Text="Refresh"
        />
</StackLayout>

这是视图模型,其中包含MyListRefreshCommandRefreshCommand提出了MyListPropertyChanged事件(通过ViewModelBase,这是MVVM Light Toolkit的一部分(:

public class MainViewModel : ViewModelBase
{
    private ObservableCollection<MyEnum> _myList;
    public ObservableCollection<MyEnum> MyList
    {
        get => _myList;
        set => Set(ref _myList, value);
    }
    public ICommand RefreshCommand =>
        new RelayCommand(() => RaisePropertyChanged(nameof(MyList)));
}
public enum MyEnum
{
    One, Two, Three, Four, Five
}

这是转换器,它将随机数附加到给定值:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var random = new Random();
        return $"{value} {random.Next(100)}";
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

首先显示页面时的事情可以正常工作:显示MyList中的每个项目,并将其附加到它的随机号码。但是,当我单击"刷新"按钮时,该按钮会为MyList提出PropertyChanged事件(我对此进行了验证(时,Picker中的项目未重新评估。我希望新的随机数显示出来,但它与以前相同(换句话说,什么都没有发生(。

您必须重置选择器的项目来源:

RefreshCommand = new Command( async () =>
{
    ObservableCollection<MyEnum> list = MyList;
    MyList = null;
    await Task.Delay(10);
    MyList = list;
});

它将再次触发转换器以删除随机值。

最新更新