読者です 読者をやめる 読者になる 読者になる

しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Xamarin.Forms で数値が含まれる範囲に応じて文字列を切り替える

C# Windows ランタイムアプリ Windows Phone XAML Xamarin

前回 の続編、今度は文字列を切り替えてみます

相変わらず 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>

色と同じような感じでできます

実行すると・・・

f:id:matatabi_ux:20150219001212p:plain

かんたんですね!