2017-07-13 8 views
1

DataTemplateのコンバーターを使用してListViewにバインドされたTransportModeTypeという列挙型のリストがあります。 ViewModelには、ListViewコントロールがどのように見えるこのコンバーターを使用してXamarin Xamlに文字列のリストをバインドする

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> 

とListToImageConverterと呼ばれる私のコンバータは、コンバータは、値がnullであることを例外がスローされます。この

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(); 
    } 
} 

のように見えます..私の縛りには何が欠けていますか

+0

nullチェックを追加して、空の文字列などを返します。バインドが完了すると、null値でいつか初期化されます。あなたはおそらくそれを無視しても安全でしょう。 –

+1

バインディング式にバインディングパスを指定する必要があると思います。 – Jason

+0

偉大なcatch @Jason!完全に見落とされているのは –

答えて

0

ヌルチェックを追加して、空の文字列などを返してください。

バインディングが完了すると、null値で時々初期化されます。あなたはおそらくそれを無視しても安全です。ですから、このような何かをコーディング編集:また

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; 
... 

、ジェイソンはあなたがここにあなたが結合されているパスを欠けているように見えるコメントで述べ:

<Image Source="{Binding YourProperty, Converter={StaticResource ListToImageConverter}}" Aspect="AspectFit"/> 

私はYourPropertyを追加する方法に注意してください、それは欠けているように見えました。もちろん、オブジェクト内の実際のプロパティの名前で置き換えてください。

1

EDIT:

enumはリストビューの有効なitemsourceではないため、まずenumを文字列に変換する必要があります。だからあなたはこれもコンバータを使用する必要があります。

のViewModel:文字列への変換

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 TransportModeEnumToString : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var transporttModeType = (TransportModeTypeEnum) value; 
     string transportName = String.Empty;  

     switch (transporttModeType) 
     { 
      case TransportModeTypeEnum.Bus: 
       transportName = "bus"; 
       break; 
      case TransportModeTypeEnum.Train: 
       transportName = "train"; 
       break; 
      case TransportModeTypeEnum.Car: 
       transportName = "car"; 
       break; 
      case TransportModeTypeEnum.Plane: 
       transportName = "plane"; 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
     return transportName; 
    } 

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

あなたの文字列:

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> 
+0

こんにちは私の問題は、datatemplateのバインディングです。イメージコントロールで使用しているコンバータはnullを取得します。 – Dan

+1

これはXamarin.Formsで偶然にも動作しますが、WPF XAMLを投稿しているようです。なぜなら、「Window」はXamarinのものではないからです。 –

+0

また、解決策は、ウィンドウソリューションであると思われる – Dan

関連する問題