Использование ValueConverter для позиционирования Line относительно ее родительского ActualHeight и другого свойства ViewModel

У меня есть свойство в моей ViewModel под названием RelativeHeight, который является двойным в диапазоне от 0 до 1.

На мой взгляд, у меня есть горизонтальная линия, ширина которой равна его контейнера (через Element Binding), но я хочу, чтобы он имел вертикальное положение относительно размера контейнера.

Например, если RelativeHeight является 0.3и контейнер ActualHeight является 200, затем Line.X1 а также Line.X2 было бы 60 каждый.

Следующий код - то, что я получил, но не знаю, как использовать (или даже если я должен использовать в первую очередь) некоторые IValueConverter потому что обычно я не могу получить свойства из вида, когда вызываю Convert метод...

<Line Stroke="Red" Opacity="0.5" StrokeThickness="5"
      X1="0" X2="{Binding ActualWidth, ElementName=Graphs}"
      Y1="{Binding RelativeHeight, Converter=MaybeSomeConversion}"
      Y2="{Binding RelativeHeight, Converter=MaybeSomeConversion}" />

1 ответ

Понял с IMultiValueConverterвот так (имена переменных на португальском):

... (resource dictionary)

<views:ConversorNível x:Key="conversorNivel"/>

....

<Line x:Name="line" Stroke="Red" Opacity="0.6" Grid.ColumnSpan="5" StrokeThickness="2"
      X1="0" X2="{Binding ActualWidth, ElementName=Gráficos}"
      Y2="{Binding Y1, ElementName=line}" >
    <Line.Y1>
        <MultiBinding Converter="{StaticResource conversorNivel}">
            <Binding Path="NívelSelecionado" />
            <Binding ElementName="Gráficos" Path="ActualHeight" />
        </MultiBinding>
    </Line.Y1>
</Line>

и в коде позади:

public class ConversorNível : IMultiValueConverter {
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)values[0] * (double)values[1];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Другие вопросы по тегам