以下是轉換器的代碼:

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} 元";
});

完畢!

推薦閱讀:

查看原文 >>
相关文章