为何在引发PropertyChanged之后不更新Picker(Xamarin.Forms)中的项目?

时间:2019-06-25 01:09:52

标签: c# xaml mvvm xamarin.forms

我已经设置了const queque=new Subject() // sequential processing queue.pipe(concatMap(item=>yourObservableFunction(item)).subscribe() // add stuff to the queue queque.next(item) ,以便为每个项目显示一个随机数字(通过转换器)。我还添加了一个按钮,该按钮在列表上引发Picker事件,以便使用一组新的随机数显示项目。但是,即使引发PropertyChanged事件,这些项目也似乎没有更新。

以下是带有PropertyChangedPicker的XAML布局:

Button

这是视图模型,其中包含<StackLayout> <Picker ItemsSource="{Binding MyList}" ItemDisplayBinding="{Binding ., Converter={StaticResource MyConverter}}" /> <Button Command="{Binding RefreshCommand}" Text="Refresh" /> </StackLayout> MyListRefreshCommand引发RefreshCommand的{​​{1}}事件(通过PropertyChanged,它是MVVM Light Toolkit的一部分):

MyList

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

ViewModelBase

首次显示该页面时,一切正常: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(); } } 的{​​{1}}事件(我对此进行了验证)时,MyList中的项目不会得到重新评估。我希望会出现新的随机数,但它与以前的数字相同(换句话说,什么也没有发生)。

1 个答案:

答案 0 :(得分:1)

您必须重置Picker的项目来源,例如:

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

它将再次触发转换器刷新随机值。