2014-11-24 9 views
0

Я пытаюсь написать элемент управления, который имеет три связанных свойства: значение, минимальное и максимальное. Изменение значения, но минимальное и максимальное фиксированы.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, который кажется неправильным.

+0

Вам не нужно реализовывать конвертацию, если вы не используете привязку twoway. Минимальные/максимальные значения всегда одинаковы для каждого звонка на этот конвертер? – ndonohoe

+0

Мне интересно, зачем вам нужен метод ConvertBack? Предположим, у меня есть число, например. 10,0. Из-за того, что вы видите только номер, невозможно угадать значения min и max для диапазона, в котором этот номер находится внутри (но это будет то, что должен был бы сделать ваш метод ConvertBack). – pgenfer

+1

Просто используйте 'КонверторПараметр', чтобы передать два ваших отсутствующих значения. – Sheridan

ответ

0

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

0

Если ваши значения Min и Max никогда не изменяются, вы можете просто использовать их как свойства в конвертере и использовать обычный IValueConverter для преобразования, тогда вы привязываете только одно значение.

Вы можете передавать значения преобразователя во время создания, как так

<UserControl.Resources> 
    <utils:AngleConverter Min="20" Max="2000" x:Key="angleConverter"/> 
</UserControl.Resources> 

Если вы хотите, чтобы связать эти свойства может быть возможно использовать DependencyObject в качестве базового класса для преобразователя и создать Мин и Макс, как свойства зависимостей вместо стандартных свойств, хотя я никогда не пробовал эту реализацию

Пользовательские управления

В конструкторе

this.Resources.Add("AngleConverter", new AngleConverter() { Min = _min, Max = _max }); 

В Min/Max значение изменилось

((AngleConverter)this.Resources["AngleConverter"]).Min = newMin; 
((AngleConverter)this.Resources["AngleConverter"]).Max = newMax; 
+0

Не работает для настраиваемого элемента управления, хотя конвертер используется шаблоном управления. Все будет иметь тот же min/max; Я бы хотел, чтобы конвертер ссылался на мин/макс текущего элемента управления. – imekon

+0

Вы можете создать ресурс программно после установки Min и Max? – ndonohoe

+0

Я добавил код, чтобы сделать это программно, на мой ответ – ndonohoe

Смежные вопросы