Posted at

Converterを改良する


Converterの不満点


  • 変換する値をいちいちボックス化解除しなければならない。

  • XAMLでResourcesに登録しないと使えない。


改善点


  • ジェネリッククラスにして、変換前と変換後の型を指定できるようにする。

  • MarkupExtensionを継承して、Resourcesへの登録を不要にする。


コンバータ

using System;

using System.Globalization;
using System.Windows.Data;
using System.Windows.Markup;

namespace Sample {
public abstract class BaseConverter<TSource, TTarget> : MarkupExtension, IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> Convert((TSource)value, parameter, culture);

public abstract TTarget Convert(TSource value, object parameter, CultureInfo culture);

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> ConvertBack((TTarget)value, parameter, culture);

public abstract TSource ConvertBack(TTarget value, object parameter, CultureInfo culture);

public override object ProvideValue(IServiceProvider serviceProvider) => this;
}
}



使い方


サンプル

using System;

using System.Globalization;
using System.Windows;

namespace Sample {
public class CustomConverter : BaseConverter<int, int> {
public override int Convert(int value, object parameter, CultureInfo culture)
=> value + 1;

public override int ConvertBack(int value, object parameter, CultureInfo culture)
=> value - 1;
}
}



XAML

<Window x:Class="Sample.MainView"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Sample"
Title="MainView" Height="300" Width="300">
<Grid>
<TextBlock Text="{Binding Value, Converter={local:CustomConverter}}"/>
</Grid>
</Window>