Xamarin.Forms PropertyChanged事件不会重新计算或重新运行IValueConverter

时间:2019-04-21 23:34:17

标签: c# xamarin xamarin.forms inotifypropertychanged ivalueconverter

我有一堆要显示给人的标签。例如:

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?我完全被困住了。

0 个答案:

没有答案