我会使用多重绑定转换器,例如以下示例:
C#代码:
namespace Example.Converters
{
public class ArithmeticConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double result = 0;
for (int i = 0; i < values.Length; i++)
{
if (!double.TryParse(values[i]?.ToString(), out var parsedNumber)) continue;
if (TryGetOperations(parameter, i, out var operation))
{
result = operation(result, parsedNumber);
}
}
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new[] { Binding.DoNothing, false };
}
private static bool TryGetOperations(object parameter, int operationIndex, out Func<double, double, double> operation)
{
operation = null;
var operations = parameter?.ToString().Split(',');
if (operations == null || operations.Length == 0) return false;
if (operations.Length <= operationIndex)
{
operationIndex = operations.Length - 1;
}
return Operations.TryGetValue(operations[operationIndex]?.ToString(), out operation);
}
public const string Add = "+";
public const string Subtract = "-";
public const string Multiply = "*";
public const string Divide = "/";
private static IDictionary<string, Func<double, double, double>> Operations = new Dictionary<string, Func<double, double, double>>
{
{ Add, (x, y) => x + y },
{ Subtract, (x, y) => x - y },
{ Multiply, (x, y) => x * y },
{ Divide, (x, y) => x / y }
};
}
}
XAML 代码:
<UserControl
xmlns:converters="clr-namespace:Example.Converters">
<UserControl.Resources>
<converters:ArithmeticConverter x:Key="ArithmeticConverter" />
</UserControl.Resources>
...
<MultiBinding Converter="{StaticResource ArithmeticConverter}" ConverterParameter="+,-">
<Binding Path="NumberToAdd" />
<Binding Path="NumberToSubtract" />
</MultiBinding>