我已经设置了一个 Picker
,以便显示每个项目的随机数(通过转换器(。我还添加了一个按钮,该按钮将PropertyChanged
事件提高在列表中,以便将项目显示为新的随机数。但是,即使 PropertyChanged
事件正在增加,这些项目似乎也没有更新。
这是带有Picker
和Button
的XAML布局:
<StackLayout>
<Picker
ItemsSource="{Binding MyList}"
ItemDisplayBinding="{Binding ., Converter={StaticResource MyConverter}}"
/>
<Button
Command="{Binding RefreshCommand}"
Text="Refresh"
/>
</StackLayout>
这是视图模型,其中包含MyList
和RefreshCommand
。RefreshCommand
提出了MyList
的PropertyChanged
事件(通过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;
});
它将再次触发转换器以删除随机值。