Как я могу привязать одно свойство к другому свойству, смещенное на определенную сумму?

Я пытаюсь связать две точки линии с двумя эллипсами, которые находятся внутри ScatterViewItems. На данный момент я могу связать ActualCenter.X и.Y для ScatterViewItem, который работает, но поскольку эллипс не является единственным элементом в этом ScatterViewItem (есть также метка), он не в центре, такой что конечные точки линии не являются центром эллипса.

Эллипс не имеет свойства ActualCenter.

Я хотел знать, могу ли я сместить привязку свойства на фиксированную величину или есть какой-то другой вид привязки, который я могу использовать так, чтобы я мог определить правильный центр эллипса в классе контейнера (для эллипса, label и scatterviewitem) и вернуть его в качестве источника привязки.

Ниже приведен код, где я устанавливаю привязку. this.avatar относится к Line форма. node_one а также node_two являются объектами-контейнерами, которые содержат ScatterViewItem, Node класс также содержит Ellipse, центр, для которого я бы по существу хотел в качестве источника, но я доволен простым смещением источника тока.

        BindingOperations.SetBinding(this.avatar, Line.X1Property, new Binding
        {
            Source = node_one.getScatterViewItem(),
            Path = new PropertyPath("ActualCenter.X")
        });
        BindingOperations.SetBinding(this.avatar, Line.Y1Property, new Binding
        {
            Source = node_one.GetNodeCenterY(),
            Path = new PropertyPath("GetNodeCenterY()")
        });

        // Bind line.(X2,Y2) to destination.ActualCenter  
        BindingOperations.SetBinding(this.avatar, Line.X2Property, new Binding
        {
            Source = node_two.getScatterViewItem(),
            Path = new PropertyPath("ActualCenter.X")
        });
        BindingOperations.SetBinding(this.avatar, Line.Y2Property, new Binding
        {
            Source = node_two.GetNodeCenterY(),
            Path = new PropertyPath("GetNodeCenterY()")
        });

Я пытался установить на Source как node_one а также Path как new PropertyPath("getOffsetCenter()") который возвращает двойной, но это не сработало. Он не жаловался, но он не работал:) Любые советы приветствуются:)


Редактировать, пытаясь использовать IValueConverter:

[ValueConversion(typeof(Double), typeof(Double))]
public class OffsetValues : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        Double y = (Double)value;
        Double offset = (Double)parameter;
        return y + offset;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Double dblValue = (Double)value;
        Double offset = (Double)parameter;
        Double resultDblValue = dblValue - offset;
        return resultDblValue;
    }
}

Выше был добавлен в качестве нового класса, но как я могу присоединить его к источнику моей привязки - пример в MSDN имеет реализацию на основе XAML, но у меня все программно.

3 ответа

Решение

Вам нужно написать некоторый ValueConverter в коде для этого.

Для получения дополнительной информации смотрите здесь.

Похоже, вы пытаетесь установить привязку к вызову метода, а не к свойству. Привязки могут ссылаться только на свойства, поскольку свойство зависимости, для которого установлена ​​привязка, должно указывать на местоположение свойства, а не на вызов метода.

Я видел, как люди используют конвертер для преобразования метода в значение свойства, но сам не использовал его.

Как примечание, я устал от написания конвертеров, чтобы компенсировать мои привязки на определенную величину, поэтому для этого создал свой собственный Math Converter. Чтобы использовать его, просто установите ConverterParameter к математическому уравнению с @VALUE заменяя связанное значение, такое как (@VALUE / 2) + 20, Если вы хотите использовать более одного связанного значения, просто измените его на MultiConverter

Сначала создайте преобразователь значений:

          [ValueConversion(typeof(double), typeof(double))]
    public sealed class OffsetValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var dblValue = (double)value;
            var offset = parameter is string pstr ? double.Parse(pstr) : (double) parameter;
            return dblValue + offset;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var dblValue = (double)value;
            var offset = (double)parameter;
            return dblValue - offset;
        }
    }

Затем создайте экземпляр в своем UserControl и ссылаться на него как на Converter в вашей Binding с ConverterParameter:

      <ParentControl x:Name="ParentName">
    <ParentControl.Resources>
        <local:OffsetValueConverter x:Key="Offset" />
    </ParentControl.Resources>
    <ParentControl.Content>
        <ChildControl Height="{Binding 
            ElementName=ParentName,
            Path=Height,
            Converter={StaticResource Offset},
            ConverterParameter=-16}" />
    </ParentControl.Content>
</ParentControl>
Другие вопросы по тегам