无论如何要将Line.X2
和Line.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
属性。
答案 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)
为实现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));
}
}
将起点/终点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);