2011-11-23 58 views
0

我想将线的两个点绑定到ScatterViewItems内部的两个椭圆。 目前,我能够绑定到ActualCenter.X和.Y的ScatterViewItem,它可以工作,但因为椭圆不是该ScatterViewItem中的唯一元素(也有一个标签),它是偏离中心的,使得线的端点不是椭圆的中心。如何将一个属性绑定到另一个属性,并按特定数量进行偏移?

Ellipse没有ActualCenter属性。

我想知道我是否能够通过固定的金额抵消属性绑定,或者是否有其他类型的绑定可以使用,以便我可以在容器类中计算出正确的椭圆中心(对于ellipse,label和scatterviewitem),并返回它作为绑定的来源。

下面是我设置绑定的代码。 this.avatar是指Line形状。 node_onenode_two是容器对象,其中包含ScatterViewItemNode类还包含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()") 
     }); 

我试图设置为Sourcenode_onePathnew 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的实现,但我的程序都是。

回答

2

您需要在后面的代码中编写一些ValueConverter。

欲了解更多信息,请看here

+0

感谢您的回复Fischermaen。 MSDN网站上的实现是基于XAML的 - 在C#中等价于什么?我也试着用属性“offsetValue”创建一个单独的类,其中构造函数使用提供的参数初始化offsetValue。我使用这个类的实例作为源,并使用“offsetValue”作为Path,但没有工作;我认为任何对象都可以用作Source,但只有DependencyProperties作为目标? – ataulm

+0

nvm,我发现它的意思是作为内联绑定的“Converter =”值。 – ataulm

+1

@ timberwo7ves:您也可以在源代码中添加值转换器。 'Binding'类也有一个Converter属性。几乎所有的东西都可以在Xaml中设置,也可以在后面的代码中设置。 – Fischermaen

1

它看起来像你试图设置绑定到方法调用,而不是属性。绑定只能引用属性,因为绑定设置的依赖属性指向属性的位置,而不是指向方法调用。

我见过人use a Converter to convert a Method to a Property value,但是自己没有用过。

作为一个方面说明,我厌倦了总是写转换器来抵消一定数量的绑定,所以创建了我自己的Math Converter来做到这一点。要使用它,只需将ConverterParameter设置为一个数学公式,用@VALUE代替该边界值,例如(@VALUE/2) + 20。如果您希望它使用多个绑定值,只需将其更改为MultiConverter

+0

谢谢瑞秋。成功抵消了价值后,我意识到我一直在以错误的方式解决问题 - 现在,当ScatterViewItem面向180度时,偏移方向错误;相反,我应该专注于确保Ellipse位于ScatterViewItem的中心,这更容易! – ataulm

相关问题