C# 使用转换器将字符串列表绑定到Xamarin Xaml
我有一个名为TransportModeType的枚举列表绑定到数据模板中带有转换器的Listview。 ViewModel如下所示C# 使用转换器将字符串列表绑定到Xamarin Xaml,c#,visual-studio,xaml,xamarin,xamarin.forms,C#,Visual Studio,Xaml,Xamarin,Xamarin.forms,我有一个名为TransportModeType的枚举列表绑定到数据模板中带有转换器的Listview。 ViewModel如下所示 public class TransportTypeViewMode:ViewModelBase{ public TransportTypeViewMode() { TransportTypes= new List<TransportTypeEnum>(); TransportTypes.add(TransportTypeEnum.Car
public class TransportTypeViewMode:ViewModelBase{
public TransportTypeViewMode()
{
TransportTypes= new List<TransportTypeEnum>();
TransportTypes.add(TransportTypeEnum.Car);
TransportTypes.add(TransportTypeEnum.Bus);
TransportTypes.add(TransportTypeEnum.Plane);
}
List<TransportTypeEnum> TransportTypes{get;set;}}
<ListView ItemsSource="{Binding TransportModeTypes}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ContentView>
<Image Source="{Binding Converter={StaticResource ListToImageConverter}}" Aspect="AspectFit"/>
</ContentView>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
public class TransportModeEnumToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var transporttModeType = (TransportModeTypeEnum) value;
string imagePath = String.Empty;
switch (transporttModeType)
{
case TransportModeTypeEnum.Bus:
imagePath = "bus.png";
break;
case TransportModeTypeEnum.Train:
imagePath = "train.png";
break;
case TransportModeTypeEnum.Car:
imagePath = "car.png";
break;
case TransportModeTypeEnum.Plane:
imagePath = "plane.png";
break;
default:
throw new ArgumentOutOfRangeException();
}
imagePath = "Common.Images." + imagePath;
var imgResc= ImageSource.FromResource(imagePath);
return imgResc;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
转换器引发值为null的异常。。我的绑定中缺少了什么编辑:
首先需要将枚举转换为字符串,因为枚举不是listview的有效itemsource。因此,您也需要使用转换器进行此操作
视图模型:
public class TransportTypeViewMode : ViewModelBase
{
public TransportTypeViewMode()
{
TransportTypes= new List<TransportTypeEnum>();
TransportTypes.add(TransportTypeEnum.Car);
TransportTypes.add(TransportTypeEnum.Bus);
TransportTypes.add(TransportTypeEnum.Plane);
}
Public List<TransportTypeEnum> TransportTypes{get;set;}}
}
您的字符串到imagesource转换器:
public class StringToImagesourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string transporttModeType = (string)value;
string imagePath = String.Empty;
switch (transporttModeType)
{
case "bus":
break;
case TransportModeTypeEnum.Train:
imagePath = "train.png";
break;
case "car":
imagePath = "car.png";
break;
case "plane":
imagePath = "plane.png";
break;
default:
throw new ArgumentOutOfRangeException();
}
imagePath = "Common.Images." + imagePath;
var imgResc= ImageSource.FromResource(imagePath);
return imgResc;
}
}
您的xaml应该是:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:c="location of your converter classes"
>
<ContentPage.Resources>
<c:EnumToStringConverter x:Key="enumtostring" />
<c:StringToImagesourceConverter x:Key="stringtoimagesource" />
</ContentPage.Resources>
<ContentPage.Content>
<ListView ItemsSource="{Binding TransportModeTypes Converter={StaticResource EnumToStringConverter}}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ContentView>
<Image Source="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource StringToImagesourceConverter}}" Aspect="AspectFit"/>
</ContentView>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage.Content>
只需添加一个空检查并返回一个空字符串或适当的内容
绑定完成后,有时会使用空值初始化它。你可以放心地忽略它。因此,请编辑以下代码:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return String.Empty;
var transporttModeType = (TransportModeTypeEnum) value;
string imagePath = String.Empty;
...
此外,Jason在评论中指出,您似乎错过了此处绑定的路径:
<Image Source="{Binding YourProperty, Converter={StaticResource ListToImageConverter}}" Aspect="AspectFit"/>
注意我是如何添加的
YourProperty
,它似乎丢失了。当然,用对象中实际属性的名称替换它。只需添加空检查并返回空字符串或其他内容。当绑定完成时,它会在某个时间被初始化为空值。您可能可以安全地忽略它。我认为您需要在绑定表达式great catch@Jason中指定绑定路径!完全忽略了这一点one@GeraldVersluis是的,很多人都支持这个答案。嗨,我的问题是datatemplate中的绑定。我在图像控件中使用的转换器获取空值。虽然巧合的是,所有这些都在Xamarin.Forms中工作,但您似乎发布了WPF XAML,因为Window
在Xamarin中不是一个东西。而且解决方案似乎是一个需要的窗口解决方案xamarin@GeraldVersluis是的,抱歉WPF是我能找到的第一个与转换器有这种绑定的,但你是对的,顺便说一句,它确实以非常不同的Xamarin.Forms xaml正确编译。@Dan让我为你重新编写我的答案,请耐心听我说。
<Image Source="{Binding YourProperty, Converter={StaticResource ListToImageConverter}}" Aspect="AspectFit"/>