Как я могу привязать одно свойство к другому свойству, смещенное на определенную сумму?
Я пытаюсь связать две точки линии с двумя эллипсами, которые находятся внутри 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>