0

我正在尝试编写一个具有三个相关属性的控件:值、最小值和最大值。值会发生变化,但最小值和最大值是固定的。

所以我写了一个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。

4

2 回答 2

0

我找到的唯一答案是创建一个名为 Angle 的属性并让它完成工作,正如我最初在我的问题中指出的那样,bonyjoe 得出结论。

于 2014-12-01T12:55:52.173 回答
0

如果您的 Min 和 Max 值永远不会改变,那么您可以将它们作为 Converter 上的属性并使用普通的 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;
于 2014-11-24T16:20:33.870 回答