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
,这是不可能和不必要的,所以我删除了它。
我有一个 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
,这是不可能和不必要的,所以我删除了它。