我已经设置了const queque=new Subject()
// sequential processing
queue.pipe(concatMap(item=>yourObservableFunction(item)).subscribe()
// add stuff to the queue
queque.next(item)
,以便为每个项目显示一个随机数字(通过转换器)。我还添加了一个按钮,该按钮在列表上引发Picker
事件,以便使用一组新的随机数显示项目。但是,即使引发PropertyChanged
事件,这些项目也似乎没有更新。
以下是带有PropertyChanged
和Picker
的XAML布局:
Button
这是视图模型,其中包含<StackLayout>
<Picker
ItemsSource="{Binding MyList}"
ItemDisplayBinding="{Binding ., Converter={StaticResource MyConverter}}"
/>
<Button
Command="{Binding RefreshCommand}"
Text="Refresh"
/>
</StackLayout>
和MyList
。 RefreshCommand
引发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
中的项目不会得到重新评估。我希望会出现新的随机数,但它与以前的数字相同(换句话说,什么也没有发生)。
答案 0 :(得分:1)
您必须重置Picker的项目来源,例如:
RefreshCommand = new Command( async () =>
{
ObservableCollection<MyEnum> list = MyList;
MyList = null;
await Task.Delay(10);
MyList = list;
});
它将再次触发转换器刷新随机值。