C# 使用Xamarin.Forms中的转换器替换图像
我正在尝试使用C# 使用Xamarin.Forms中的转换器替换图像,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我正在尝试使用Xamarin.Forms中的Converters根据数据下载动态更改Image源代码 从服务器获取数据总共有三种状态 1) 成功下载数据时成功 2) 未下载数据且存在错误时出错 3) 当进程空闲时 对于以上所有情况,我使用不同的图标 这是我的XAML代码 <Image Source="{Binding CustomerState, Converter={StaticResource SyncConverter}}" HorizontalOptions="CenterA
Xamarin.Forms中的Converters
根据数据下载动态更改Image
源代码
从服务器获取数据总共有三种状态
1) 成功下载数据时成功
2) 未下载数据且存在错误时出错
3) 当进程空闲时
对于以上所有情况,我使用不同的图标
这是我的XAML代码
<Image Source="{Binding CustomerState, Converter={StaticResource SyncConverter}}" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="0" HeightRequest="20" Margin="8,12,8,12" />
在上述代码中,如果CustomeState
为空,则显示ic_idle
图标,如果cuswtomerst
为真,则显示成功,否则显示错误
我的视图模型代码
private bool? isCustomerState;
public bool? CustomerState
{
get { return isCustomerState; }
set
{
isCustomerState = value;
OnPropertyChanged("CustomerState");
}
}
但不知何故,xamarin在get{return isCustomerState;}
上抛出了错误,错误是
System.NullReferenceException:对象引用未设置为实例
指一个物体
您可以在使用“值”之前尝试验证它。差不多
public class SyncConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value != null){
bool? syncState = value as bool?;
if (syncState != null) {
if (syncState.Value) return "ic_success";
else return "ic_error";
}
}
return "ic_idle";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
您可以在使用“值”之前尝试验证它。差不多
public class SyncConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value != null){
bool? syncState = value as bool?;
if (syncState != null) {
if (syncState.Value) return "ic_success";
else return "ic_error";
}
}
return "ic_idle";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
更新:正如Alessandro在评论中提到的-在这种情况下,转换器提供的实例返回类型可能不是实际问题。应处理从字符串到ImageSource的转换
由于要绑定到的源属性的类型为-因此转换器还应返回类型为的实例
您可以在此处找到更多详细信息:
更新:正如Alessandro在评论中提到的-在这种情况下,转换器提供的实例返回类型可能不是实际问题。应处理从字符串到ImageSource的转换
由于要绑定到的源属性的类型为-因此转换器还应返回类型为的实例
您可以在此处找到更多详细信息:
如果我设置了private bool,仍然会收到相同的错误?isCustomerState=false
那么我不会抛出,但在这种情况下,它显示的是ic_错误而不是ic_状态我需要为此使用DataTrigger吗?或者转换器需要足够的时间IsVisible=“{Binding MasterState}
字段当MasterState变为null时IsVisible不知道该做什么,what sayWhy”IsVisible"? 您应该绑定源代码。那么IsVisible的MasterState不应为null。如果它可以为null,那么如果我设置了private bool,那么使用一个IValueConverter将可为null的值转换为True,否则仍然会得到相同的错误?isCustomerState=false
那么我不会抛出,但在这种情况下,它显示的是ic_错误而不是ic_状态我需要为此使用DataTrigger吗?或者转换器需要足够的时间IsVisible=“{Binding MasterState}
字段当MasterState变为null时IsVisible不知道该做什么,what sayWhy”IsVisible"? 您应该绑定源代码。那么IsVisible的MasterState不应为null。如果可以为null,则使用IValueConverter将可为null的值转换为false的True。它还可以返回stringYes-您是对的。binding属性上的TypeConverter应该负责从字符串到ImageSource的转换。它还可以返回stringYes-你说得对。binding属性上的TypeConverter应该负责从字符串到ImageSource的转换。这不起作用。您误解了什么是targetType
。这也不是在C#中检测null
的方法。这不起作用。您误解了什么是targetType
。这也不是在C#中检测null
的方法。
public class SyncConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value != null){
bool? syncState = value as bool?;
if (syncState != null) {
if (syncState.Value) return ConvertToImageSource("ic_success");
else return ConvertToImageSource("ic_error");
}
}
return ConvertToImageSource("ic_idle");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
private ImageSource ConvertToImageSource(string fileName)
{
return Device.OnPlatform(
iOS: ImageSource.FromFile($"Images/{fileName}"),
Android: ImageSource.FromFile(fileName),
WinPhone: ImageSource.FromFile($"Images/{fileName}"));
}
}
public class SyncConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (targetType != typeof(bool))
return ConvertToImageSource("ic_idle");
return (bool)value? ConvertToImageSource("ic_success"): ConvertToImageSource("ic_error");
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return (bool)value;
}
}