前回 の続編、今度は文字列を切り替えてみます
相変わらず Converter を作ります!
/// <summary> /// 数値から文字列に変換する Converter /// </summary> [ContentProperty("Ranges")] public class RangeToTextConverter : IValueConverter { /// <summary> /// 数値範囲定義 /// </summary> public List<RangeToText> Ranges { get; set; } /// <summary> /// コンストラクタ /// </summary> public RangeToTextConverter() { this.Ranges = new List<RangeToText>(); } /// <summary> /// 数値から文字列に変換します /// </summary> /// <param name="value">数値</param> /// <param name="targetType">対象の型</param> /// <param name="parameter">パラメータ</param> /// <param name="culture">カルチャ</param> /// <returns>文字列</returns> public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var text = string.Empty; var number = default(double); if (value is double) { number = (double)value; } else if (value != null) { double.TryParse(value.ToString(), out number); } var range = (from r in this.Ranges where r.From <= number && r.To >= number select r).FirstOrDefault(); if (range == null) { return text; } return range.Text; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } /// <summary> /// 数値範囲の記述クラス /// </summary> public class RangeToText : BindableObject { /// <summary> /// 数値範囲の最小値 /// </summary> public double From { get; set; } /// <summary> /// 数値範囲の最大値 /// </summary> public double To { get; set; } /// <summary> /// 変換後の文字列 /// </summary> public string Text { get; set; } /// <summary> /// コンストラクタ /// </summary> public RangeToText() { this.From = 0d; this.To = 0d; this.Text = string.Empty; } }
ほとんど構造が変わってないですね
そして 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:b="clr-namespace:XamarinControl.Behaviors;assembly=XamarinControl" xmlns:c="clr-namespace:XamarinControl.Controls;assembly=XamarinControl" xmlns:cv="clr-namespace:XamarinControl.Converters;assembly=XamarinControl" xmlns:s="clr-namespace:XamarinControl.Selectors;assembly=XamarinControl" xmlns:vm="clr-namespace:XamarinControl.ViewModels;assembly=XamarinControl" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" x:Class="XamarinControl.Views.TopPage"> <ContentPage.Resources> <ResourceDictionary> <cv:RangeToColorConverter x:Key="RangeToColorConverter"> <cv:RangeToColor From="0" To="60" Color="Red"/> <cv:RangeToColor From="60" To="80" Color="Green"/> <cv:RangeToColor From="80" To="100" Color="Blue"/> </cv:RangeToColorConverter> <cv:RangeToTextConverter x:Key="RangeToTextConverter"> <cv:RangeToText From="0" To="60" Text="赤点です!"/> <cv:RangeToText From="80" To="100" Text="合格!"/> </cv:RangeToTextConverter> </ResourceDictionary> </ContentPage.Resources> <ListView > <ListView.ItemsSource> <scg:List x:TypeArguments="x:Int32"> <x:Int32>50</x:Int32> <x:Int32>70</x:Int32> <x:Int32>80</x:Int32> <x:Int32>100</x:Int32> </scg:List> </ListView.ItemsSource> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout Orientation="Horizontal" Padding="20,10" Spacing="10"> <Label Text="{Binding StringFormat='{0} 点'}" HorizontalOptions="Center" VerticalOptions="Center" TextColor="{Binding Converter={StaticResource RangeToColorConverter}}" FontSize="50"/> <Label Text="{Binding Converter={StaticResource RangeToTextConverter}}" HorizontalOptions="Center" VerticalOptions="Center" FontSize="40"/> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </ContentPage>
色と同じような感じでできます
実行すると・・・
かんたんですね!