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;