У меня есть куча ярлыков, которые я хочу показать людям. Например:
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
с? Я полностью застрял.