Событие PropertyChanged Xamarin.Forms не пересчитывает и не перезапускает IValueConverter - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть куча ярлыков, которые я хочу показать людям. Например:

Name <value>
Age <value>
Cell <value>
Home# <value>

и т. Д., Но я не могу гарантировать, что во всех этих полях есть данные. Чтобы компенсировать это, я использую IValueConverter для просмотра строки, определения, является ли она нулевой или пробелом, а затем связываю свойство IsVisible следующим образом:


<Label Style="{StaticResource gridLabel}" Text="{i18n:Translate CellPhone}"  IsVisible="{Binding CellPhone, Converter={StaticResource StringNull}}" Grid.Row="11" Grid.Column="0" VerticalOptions="Center"/>
<Label Style="{StaticResource gridValue}" Text="{Binding CellPhone}" IsVisible="{Binding CellPhone, Converter={StaticResource StringNull}}" Grid.Row="11" Grid.Column="1" TextColor="Blue" Margin="0,10,0,10" VerticalOptions="Center" />


    public class StringNullOrEmptyBoolConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {            
            if (value != null)
            {
                string s = value.ToString().Trim();
                return !string.IsNullOrWhiteSpace(s);
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Моя ViewModel предоставляет только определенные поля. Все мои свойства такие вещи:


public string CellPhone => _details.CellPhone;

Поэтому, когда я переключаю людей и пытаюсь обновить страницу, я приказываю ViewModel просмотреть его свойства и запустить OnPropertyChanged для каждого:


private async Task GetData()
{
    _details = await MyWebService.GetPersonDetails();

    foreach (var property in GetType().GetProperties())
        OnPropertyChanged(nameof(property));
}

private void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Я могу посмотреть в отладчике и увидеть, как происходят все эти PropertyChanged события. Но когда я переключаю людей, ярлыки, которые скрыты или не скрыты, остаются такими. Некоторые из отображаемых меток больше не имеют данных, поэтому я хочу их скрыть, а метки, которые не отображались, но имеют данные, по-прежнему невидимы. Я могу проверить это для себя, вынув Конвертер на этикетке. Данные обновляются, но IValueConverter не запускается повторно. Я убедился в этом, установив точку останова. Когда страница создается, первый человек запускает их, но когда я переключаю людей, они никогда не запускаются снова.

Что я могу сделать, чтобы перезапустить все IValueConverter с? Я полностью застрял.

...