ValueConverter с несколькими аргументами

Я пытаюсь написать элемент управления, который имеет три связанных свойства: значение, минимум и максимум. Изменения значения, но минимальное и максимальное зафиксированы.

Поэтому я написал 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, который кажется неправильным.

2 ответа

Решение

Единственный ответ, который я нашел, - это создать свойство под названием Angle и позволить ему выполнять работу, как я изначально указывал в своем вопросе, и, как заключил Бонижо.

Если ваши минимальные и максимальные значения никогда не меняются, вы можете просто использовать их в качестве свойств в конвертере и использовать обычный 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;
Другие вопросы по тегам