Почему элементы в средстве выбора (Xamarin.Forms) не обновляются после поднятия PropertyChanged? - PullRequest
0 голосов
/ 25 июня 2019

Я настроил Picker, чтобы каждый элемент отображался со случайным числом, добавленным к нему (через конвертер). Я также добавил кнопку, которая вызывает событие PropertyChanged в списке, чтобы элементы отображались с новым набором случайных чисел. Однако, хотя событие PropertyChanged возникает, элементы не обновляются.

Вот макет XAML с Picker и Button:

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

Вот модель представления, которая содержит MyList и RefreshCommand. RefreshCommand вызывает событие PropertyChanged для MyList (через 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 отображается со случайным числом, добавленным к нему. Однако, когда я нажимаю кнопку «Обновить», которая вызывает событие PropertyChanged для MyList (я это подтвердил), элементы в Picker не переоцениваются. Я ожидал появления новых случайных чисел, но это те же числа, что и раньше (другими словами, ничего не происходит).

1 Ответ

1 голос
/ 25 июня 2019

Вы должны сбросить источник предметов Пикера, например:

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

Он снова запустит преобразователь, чтобы обновить случайное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...