我正在尝试编写一个具有三个相关属性的控件:值、最小值和最大值。值会发生变化,但最小值和最大值是固定的。
所以我写了一个IMultiValueConverter:
public class AngleMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double value = (double)values[0];
double minimum = (double)values[1];
double maximum = (double)values[2];
double angle = -150.0 + ((value - minimum) * 300.0 / (maximum - minimum));
return angle;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML 如下所示(它是一个自定义控件,因此是 RelativeSource 的东西):
<RotateTransform.Angle>
<MultiBinding Converter="{StaticResource angleMultiConverter}">
<Binding Path="Value" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}"/>
<Binding Path="MinimumValue" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}" Mode="OneWay"/>
<Binding Path="MaximumValue" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}" Mode="OneWay"/>
</MultiBinding>
</RotateTransform.Angle>
这很好用,但是 ConvertBack 呢?我必须传回三个值……但我只有一个?另外两个是常数,那么我怎么知道它们是什么?
我的另一个可行的解决方案是创建一个名为 Angle 的依赖属性,它在自定义控件中完成所有工作......但暴露了似乎错误的 Angle。