如何将Line终点(X2,Y2)绑定到Point?

时间:2012-06-04 05:35:55

标签: c# wpf binding line

无论如何要将Line.X2Line.Y2绑定到Point的{​​{1}}和X?现在,当我使用

Y

它第一次有效,然后当我更改line.DataContext=testPoint; line.SetBinding(Line.X2Property,new Binding("X")); line.SetBinding(Line.Y2Property,new Binding("Y")); testPoint.X时,它不会改变。怎么办?

[编辑] 我有很多testPoint.Y,甚至可能会增加,因为我无法为每个Lines创建Point属性。

4 个答案:

答案 0 :(得分:1)

当源更改时,需要更新绑定。您可以使Point成为DependencyProperty,或者使包含Point的类实现INotifyPropertyChanged。请注意,无论哪种方式,您都希望将其作为属性而不是字段公开,否则如果您直接修改X和Y值,它仍然不会更新。将其作为属性公开时,可以使用以下语法更新单个值:

TestPoint = new Point(newXvalue, TestPoint.Y);

这会更新单个值,但也会触发任何setter函数,例如PropertyChanged。

以下是使用INotifyPropertyChanged的简单示例:

http://msdn.microsoft.com/en-us/library/ms229614.aspx

创建自己的DependencyProperty的简短示例:

http://www.codeproject.com/Articles/42203/How-to-Implement-a-DependencyProperty

答案 1 :(得分:0)

Moozhe所述:

impelement INotifyPropertyChanged并为你的点写一个包装器属性:

public double X {
    get { return TestPoint.X; }
    set { TestPoint.X = value;
          OnPropertyChanged("X");
        }
}

Y ...

相同

和事件:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(String property)
{
    if (PropertyChanged == null) return;
    PropertyChanged(this, new PropertyChangedEventArgs(property));
}

答案 2 :(得分:0)

要使WPF绑定工作,您的testPoint必须是能够通知属性更改的对象。如果testPoint没有实现INotifyPropertyChanged接口,那么您所看到的行为是预期的。行端点绑定到原始值,并且不会传播更改。 要解决您的第一个问题,请确保testPoint正确实现所需的接口。

要使WPF绑定能够处理对象集合,您必须使用能够通知集合更改的集合。如果testPoints集合未实现INotifyCollectionChanged接口,那么您的行端点将绑定到原始对象数。 要解决第二个问题,请使用ObservableCollection。

我还建议使用XAML设置绑定而不是代码隐藏。

答案 3 :(得分:0)

  1. 为实现INotifyPropertyChanged接口的点编写一个包装类

    public class BindingPoint : INotifyPropertyChanged
    {
        private Point point;
    
        public BindingPoint(double x, double y)
        {
            point = new Point(x, y);
        }
    
        public double X
        {
            get { return point.X; }
            set
            {
                point.X = value;
                OnPropertyChanged();
                OnPropertyChanged("Point");
            }
        }
    
        public double Y
        {
            get { return point.Y; }
            set
            {
                point.Y = value;
                OnPropertyChanged();
                OnPropertyChanged("Point");
            }
        }
    
        public Point Point
        {
            get { return point; }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
  2. 将起点/终点X和Y属性绑定到行

    Line line = new Line();
    BindingPoint startPoint = new BindingPoint(0,0);
    BindingPoint endPoint = new BindingPoint(0,0);
    
    var b = new Binding("X")
    {
        Source = startPoint,
        Mode = BindingMode.TwoWay
    };
    line.SetBinding(Line.X1Property, b);
    
    b = new Binding("Y")
    {
        Source = startPoint,
        Mode = BindingMode.TwoWay
    };
    line.SetBinding(Line.Y1Property, b);
    
    b = new Binding("X")
    {
        Source = endPoint,
        Mode = BindingMode.TwoWay
    };
    line.SetBinding(Line.X2Property, b);
    
    b = new Binding("Y")
    {
        Source = endPoint,
        Mode = BindingMode.TwoWay
    };
    line.SetBinding(Line.Y2Property, b);