Xamarin:如何在通知调用中调用 IValueConverter

Xamarin : How to invoke IValueConverter on a notification call

我有一个 Listview(绑定到 ObservableCollection),所有元素都基于 IValueConverter 进行 Enable/Disable 计算。

下面是 IValueConverter 的代码...

public class StateCheckConverter: IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var result = false;

            if (value != null)
            {
                var element = value as Element;
                if (element.Status != Status.Pending)
                    result = true;
            }

            return result;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }

现在我收到了一条通知(来自 MessageCenter),其中一个元素的回调状态已经改变。我能够更改元素的文本和值(比如标签,使用 INotifyPropertyChanged 的​​图像)。但是如何调用相应的 IValueConverter 并更新 ObservableCollection?

谢谢。

更新:

<ContentPage.Resources>
    <ResourceDictionary>
      <vm:StateCheckConverter x:Key="transmissionStateCheck" />
    </ResourceDictionary>
  </ContentPage.Resources>

<Label x:Name="lblLocked"
                         IsVisible="{Binding ., Converter={StaticResource transmissionStateCheck}, Mode=TwoWay}"
                         HorizontalTextAlignment="Center"
                         BackgroundColor="Gray"
                         Opacity="0.75"
                         Text="LOCKED"
                         TextColor="White"
                         FontSize="35"
                         />

好的,一种方法是更改​​绑定 属性 并绑定到 Status 本身:

<Label x:Name="lblLocked"
       IsVisible="{Binding Status, Converter={StaticResource transmissionStateCheck}}"
       HorizontalTextAlignment="Center"
       BackgroundColor="Gray"
       Opacity="0.75"
       Text="LOCKED"
       TextColor="White"
       FontSize="35"/>

当然,您还必须更改值转换器:

public class StateCheckConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var result = false;

        if (value is Status status)
        {
            if (status != Status.Pending)
                result = true;
        }

        return result;
    }

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

希望对您有所帮助:)

我还更改了您的代码中的一些内容。您不能将 IsVisible 绑定为双向模式,因此它会自动成为一种方式。

同时转换回来应该采用 bool 和 return Status,这是不可能和不必要的,所以我删除了它。