Привязка ObservableCollection <Point>к PathFigure - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 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>

Это работает так, как я хочу, но, очевидно, я не хочу перечислять каждый элемент списка вручную и не могу понять, как этого избежать без добавления другого конвертера ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...