У меня есть ObservableCollection of Points, из которой я хотел бы нарисовать ломаную линию. До сих пор я использовал простой конвертер, подобный этому:
[ValueConversion(typeof(ObservableCollection<MyPoint>), typeof(PathGeometry))]
public class PointsDisplayConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<MyPoint> path = value as ObservableCollection<MyPoint>;
if (path == null)
return null;
if (path.Count == 0)
return null;
PathFigure target = new PathFigure();
target.StartPoint = new Point(path[0].X, path[0].Y);
target.Segments = new PathSegmentCollection();
for (int i = 1; i < path.Points.Count; i++)
{
LineSegment segment = new LineSegment();
segment.Point = new Point(path[i].X, path[i].Y);
target.Segments.Add(segment);
}
PathGeometry myPathGeometry = new PathGeometry();
myPathGeometry.Figures = new PathFigureCollection();
myPathGeometry.Figures.Add(target);
return myPathGeometry;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Но мне нужно обновить чертеж, когда изменяется любое из свойств X, Y (MyPoint, очевидно, сам реализует INotifyPropertyChanged) или точки добавляются / удаляются, и конвертер в этом случае не вызывается, потому что экземпляр ObservableCollection не изменился , Поэтому мне нужно связать все свойства в XAML. Пока что самое близкое, что у меня есть, это:
<Path Stroke="Green" StrokeThickness="2" Stretch="Fill">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure>
<PathFigure.StartPoint>
<MultiBinding>
<MultiBinding.Converter>
<local:PointConverter/>
</MultiBinding.Converter>
<MultiBinding.Bindings>
<Binding Path="Points[0].X"/>
<Binding Path="Points[0].Y"/>
</MultiBinding.Bindings>
</MultiBinding>
</PathFigure.StartPoint>
<PathFigure.Segments>
<PathSegmentCollection>
<LineSegment>
<LineSegment.Point>
<MultiBinding>
<MultiBinding.Converter>
<local:PointConverter/>
</MultiBinding.Converter>
<MultiBinding.Bindings>
<Binding Path="Points[1].X"/>
<Binding Path="Points[1].Y"/>
</MultiBinding.Bindings>
</MultiBinding>
</LineSegment.Point>
</LineSegment>
<!-- ... more copies for Points[2], Points[3] etc follow ... -->
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
Это работает так, как я хочу, но, очевидно, я не хочу перечислять каждый элемент списка вручную и не могу понять, как этого избежать без добавления другого конвертера ...