0

反正有绑定Line.X2Line.Y2PointXY吗?现在,当我使用

line.DataContext=testPoint;
line.SetBinding(Line.X2Property,new Binding("X"));
line.SetBinding(Line.Y2Property,new Binding("Y"));

它第一次工作,然后当我改变testPoint.XtestPoint.Y它没有改变时。该怎么办?

[编辑] 我有很多Lines,甚至可能会增加,因为我不能Point为每个Line.

4

4 回答 4

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

于 2012-06-04T05:45:39.080 回答
0

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

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

我还建议使用 XAML 来设置绑定而不是后面的代码。

于 2012-06-04T07:44:45.887 回答
0

如前所述Moozhe

impelementINotifyPropertyChanged并为您的观点编写一个包装器属性:

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));
}
于 2012-06-04T05:59:55.543 回答
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. 将 startpoint / endPoint X 和 Y 属性绑定到 line

    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);
    
于 2015-08-19T08:01:23.820 回答