在 XAML 中定義一個萬能轉換器
以下是轉換器的代碼:
public static class ValueConverter
{
public static IValueConverter Create<TInput, TOutput>(Func<ValueConverterArgs<TInput>, TOutput> convertFunc, Func<ValueConverterArgs<TOutput>, TInput> convertBackFunc = null)
{
return new InnerValueConverter<TInput, TOutput>(convertFunc, convertBackFunc);
}
private class InnerValueConverter<TInput, TOutput> : IValueConverter
{
private Func<ValueConverterArgs<TInput>, TOutput> _convertFunc = null;
private Func<ValueConverterArgs<TOutput>, TInput> _convertBackFunc = null;
public InnerValueConverter(Func<ValueConverterArgs<TInput>, TOutput> convertFunc, Func<ValueConverterArgs<TOutput>, TInput> convertBackFunc)
{
this._convertFunc = convertFunc;
this._convertBackFunc = convertBackFunc;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return this._convertFunc(new ValueConverterArgs<TInput>((TInput)value, parameter, culture));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (this._convertBackFunc == null)
{
throw new NotImplementedException();
}
return this._convertBackFunc(new ValueConverterArgs<TOutput>((TOutput)value, parameter, culture));
}
}
}
public class ValueConverterArgs<T>
{
public T Value { get; private set; }
public object Parameter { get; private set; }
public CultureInfo Culture { get; private set; }
public ValueConverterArgs(T value, object parameter, CultureInfo culture)
{
this.Value = value;
this.Parameter = parameter;
this.Culture = culture;
}
}
使用時,需要定義幾個靜態轉換器屬性(在任意類中定義即可):
public static IValueConverter BoolNegation { get; } =
ValueConverter.Create<bool, bool>(p => !p.Value);
public static IValueConverter VisibleIfTrue { get; } =
ValueConverter.Create<bool, Visibility>(p => p.Value ? Visibility.Visible : Visibility.Collapsed);
然後就可以引用了:
<TextBlock Text="{Binding Sex,Converter={x:Static local:MainWindow.BoolNegation}}"/>
以下是一些定義轉換器的示例:
public static IValueConverter ProductConvert { get; } = Jesse.Wpf.ValueConverter.Create<Product, string>(p =>
{
return $"[{p.Parameter}] {p.Value.Id}: {p.Value.Name} ({p.Value.Price:0.00} 元)";
});
public static IValueConverter PriceConvert { get; } = Jesse.Wpf.ValueConverter.Create<decimal, string>(p =>
{
return $"{p.Value:0.00} 元";
});
完畢!
推薦閱讀: