我有一个viewmodel类,其中包含double X
和double Y
变量,我想将其绑定到BezierSegment,这似乎不适用于我的代码......
public class TestViewModel:ViewModelBase
{
public TestViewModel()
{
TStart = new TPoint {X=20.0,Y=45.0 };
TEnd = new TPoint { X = 200.0, Y = 450.0 };
}
public TPoint TStart { get; set; }
public TPoint TEnd { get; set; }
}
public class TPoint:ViewModelBase
{
private double _X;
public double X
{
get { return _X; }
set
{
if (_X != value)
{
_X = value;
RaisePropertyChanged("X");
}
}
}
private double _Y;
public double Y
{
get { return _Y; }
set
{
if (_Y != value)
{
_Y = value;
RaisePropertyChanged("Y");
}
}
}
}
}
和XAML
<Window.DataContext>
<vm:TestViewModel />
</Window.DataContext>
<Grid>
<Path Stroke="Black" StrokeThickness="3">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure>
<PathFigure.Segments>
<PathSegmentCollection>
<BezierSegment>
<BezierSegment.Point1>
<Point X="{Binding TStart.X}" Y="{Binding TStart.Y}" />
</BezierSegment.Point1>
<BezierSegment.Point3>
<Point X="{Binding TEnd.X}" Y="{Binding TEnd.Y}" />
</BezierSegment.Point3>
</BezierSegment>
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
我得到一个错误,只能为DependencyObject的DependencyProperties定义X和Y的绑定....
我不想依赖Windows Class Point ... 虽然这甚至不适用于这个例子。
有人可以告诉我如何将自己的点坐标绑定到BezierSegemnt Point1 Point2 Point3吗?
答案 0 :(得分:1)
你必须这样做:
public class TPoint:ViewModelBase
{
private double _X;
public double X
{
get { return _X; }
set
{
if (_X != value)
{
_X = value;
RaisePropertyChanged("X");
RaisePropertyChanged("P");
}
}
}
private double _Y;
public double Y
{
get { return _Y; }
set
{
if (_Y != value)
{
_Y = value;
RaisePropertyChanged("Y");
RaisePropertyChanged("P");
}
}
}
public Point P { get { return new Point(X,Y);}}
}
并在XAML中:
<Window.DataContext>
<vm:TestViewModel />
</Window.DataContext>
<Grid>
<Path Stroke="Black" StrokeThickness="3">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure>
<PathFigure.Segments>
<PathSegmentCollection>
<BezierSegment Point1="{Binding TStart.P}" Point3="{Binding TEnd.P}"/>
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
让我知道它是否有效,我离开发环境不远
答案 1 :(得分:0)
点包装 - &gt; BindingPoint与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));
}
}
绑定到BezierSegment:
private Path DefineBezierSegment(BindingPoint startPoint, BindingPoint endPoint, BindingPoint startBezierPoint, BindingPoint endBezierPoint)
{
BezierSegment spline = new BezierSegment {IsStroked = true};
var b = new Binding("Point")
{
Source = startBezierPoint,
Mode = BindingMode.TwoWay
};
BindingOperations.SetBinding(spline, BezierSegment.Point1Property, b);
b = new Binding("Point")
{
Source = endBezierPoint,
Mode = BindingMode.TwoWay
};
BindingOperations.SetBinding(spline, BezierSegment.Point2Property, b);
b = new Binding("Point")
{
Source = endPoint,
Mode = BindingMode.TwoWay
};
BindingOperations.SetBinding(spline, BezierSegment.Point3Property, b);
var pColl = new PathSegmentCollection {spline};
var pFig = new PathFigure(StartPort.Origin.Point, pColl, false);
b = new Binding("Point")
{
Source = startPoint,
Mode = BindingMode.TwoWay
};
BindingOperations.SetBinding(pFig, PathFigure.StartPointProperty, b);
var pfColl = new PathFigureCollection { pFig };
return new Path() {Data = new PathGeometry(pfColl)};
}