我有一堆要显示给人的标签。例如:
Name <value>
Age <value>
Cell <value>
Home# <value>
等,但是我不能保证所有这些字段中都包含数据。为了补偿,我使用IValueConverter
查看一个字符串,确定它是null还是空格,然后像这样绑定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
事件的发生。但是,当我切换人员时,隐藏或未隐藏的标签仍然保持这种方式。显示的某些标签不再具有数据,因此我想隐藏它们,而未显示但具有数据的标签仍然不可见。我可以通过取出标签中的Converter自己检查一下。数据会更新,但是IValueConverter
不会重新触发。我通过设置一个断点来确保这一点。创建页面后,第一人会解雇他们,但是当我切换人员时,他们再也不会解雇。
我该怎么做才能重新运行所有IValueConverter
?我完全被困住了。