Свойства привязки конвертера внутри стиля для CustomControl - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть конвертер, который отображает процент в диапазон. У него есть два свойства зависимостей для хранения начала и конца диапазона. Ниже приведен пример его объявления:

<local:PercentToRangeConverter RangeStart="50" RangeEnd="200" />

Я использую конвертер в стиле для Width CustomControl, где MinWidth и MaxWidth связаны с RangeStart и RangeEnd преобразователя. К сожалению, это не работает. Я уже убедился, что сам конвертер работает, вручную установив значения RangeStart и RangeEnd с произвольным числом.


Я сделал два способа привязки Свойства CustomControl для преобразователей:

  1. Объявите преобразователь внутри 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 может повлиять на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...