我试图编写一个具有三个相关属性的控件:value,minimum和maximum。值的变化,但最小值和最大值是固定的。
所以我写了一个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>
这很好用,但转换回来呢?我必须传回三个价值......但我只有一个?另外两个是常数,所以我怎么知道它们是什么?
我的另一个解决方案是创建一个名为Angle的依赖属性,它可以完成自定义控件中的所有工作......但是暴露出看似错误的Angle。
答案 0 :(得分:0)
如果您的最小值和最大值永远不会改变,那么您可以将它们作为转换器上的属性并使用普通的IValueConverter进行转换,然后您只绑定单个值。
您可以在创建时将值传递给转换器,如此
<UserControl.Resources>
<utils:AngleConverter Min="20" Max="2000" x:Key="angleConverter"/>
</UserControl.Resources>
如果要绑定这些属性,可以使用DependencyObject作为转换器的基类,并将Min和Max创建为依赖属性而不是标准属性,尽管我从未尝试过这个
自定义控制实施
在构造函数
中this.Resources.Add("AngleConverter", new AngleConverter() { Min = _min, Max = _max });
最小值/最大值已更改
((AngleConverter)this.Resources["AngleConverter"]).Min = newMin;
((AngleConverter)this.Resources["AngleConverter"]).Max = newMax;
答案 1 :(得分:0)
我找到的唯一答案就是创建一个名为Angle的属性,让它完成工作,就像我最初在我的问题中指出的那样,bonyjoe得出结论。