У меня есть конвертер, который отображает процент в диапазон. У него есть два свойства зависимостей для хранения начала и конца диапазона. Ниже приведен пример его объявления:
<local:PercentToRangeConverter RangeStart="50" RangeEnd="200" />
Я использую конвертер в стиле для Width
CustomControl, где MinWidth
и MaxWidth
связаны с RangeStart
и RangeEnd
преобразователя. К сожалению, это не работает. Я уже убедился, что сам конвертер работает, вручную установив значения RangeStart
и RangeEnd
с произвольным числом.
Я сделал два способа привязки Свойства CustomControl для преобразователей:
- Объявите преобразователь внутри Style.Resources, свяжите свойства внутри него, затем используйте преобразователь в качестве ресурса c.
<Style TargetType="{x:Type local:MyControl}">
<Style.Resources>
<local:PercentToRangeConverter x:Key="PercentToRangeConverter"
RangeStart="{Binding MinWidth, RelativeSource={RelativeSource Self}"
RangeEnd="{Binding MaxWidth, RelativeSource={RelativeSource Self}" />
</Style.Resources>
. . .
Объявите конвертер в свойстве converter тега Binding внутри значения установщика . . .
<Setter Property="Width">
<Setter.Value>
<Binding Path="Percent" RelativeSource="{RelativeSource Self}">
<Binding.Converter>
<local:PercentToRangeConverter
RangeStart="{Binding MinWidth, RelativeSource={RelativeSource Self}"
RangeEnd="{Binding MaxWidth, RelativeSource={RelativeSource Self}" />
</Binding.Converter>
</Binding>
</Setter.Value>
</Setter>
. . .
</Style>
Опять же, это работает, когда я устанавливаю вручную Значение. Поэтому я думаю, что RelativeSource={RelativeSource Self}
неверно для привязки, но я не могу думать ни о чем другом, чтобы связать CustomControl Width
. Я также думаю, что оба метода не имеют одинакового правильного способа установки источника, учитывая, что способ объявления конвертера различен для обоих методов. В любом случае, я просто хочу успешно связать MinWidth
и MaxWidth
с конвертером.
PS Является ли "объявить" даже подходящий термин для этого?
РЕДАКТИРОВАТЬ: Вот код для конвертера в соответствии с просьбой.
public class PercentToRangeConverter : DependencyObject, IValueConverter
{
public double RangeStart
{
get => (double)GetValue(RangeStartProperty);
set => SetValue(RangeStartProperty, value);
}
protected static readonly DependencyProperty RangeStartProperty = DependencyProperty.Register("RangeStart", typeof(double), typeof(PercentToRangeConverter), new PropertyMetadata(default(double)));
public double RangeEnd
{
get => (double)GetValue(RangeEndProperty);
set => SetValue(RangeEndProperty, value);
}
protected static readonly DependencyProperty RangeEndProperty = DependencyProperty.Register("RangeEnd", typeof(double), typeof(PercentToRangeConverter), new PropertyMetadata(default(double)));
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (double)value * (RangeEnd - RangeStart) + RangeStart;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
РЕДАКТИРОВАТЬ (1): Забыл добавить, я на самом деле ищу ответы другие чем MultiBinding
. Причина в том, что я анимирую значение Percent
. Я думал, что MultiBinding
может повлиять на производительность.