C# 使用转换器将字符串列表绑定到Xamarin Xaml

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

我有一个名为TransportModeType的枚举列表绑定到数据模板中带有转换器的Listview。 ViewModel如下所示

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"/>