Рисование двух полилиний из одного исключения PointCollection (Silverlight 5) - PullRequest
1 голос
/ 11 января 2012

Я использую Silverlight 5 с MVVM.

У меня есть ViewModel, Singleton . ViewModel предоставляет PointCollection, который я использую для рисования Polyline в одном из моих видов.

Если я попытаюсь нарисовать тот же Polyline во втором виде, снова привязав данные к PointCollection, я получу исключение «значение не попадает в ожидаемый диапазон».

Насколько я мог судить (с моими ограниченными знаниями Silverlight), это вызвано тем, что PointCollections не доступны для совместного использования.

Есть ли обходной путь? Как я могу получить вторую нарисованную Полилинию, идентичную первой? Я хочу привязать данные двух полилиний к одной коллекции PointCollection одновременно.

Редактировать: я не нашел решения, но кто-то с такой же проблемой здесь . По данным Microsoft:

На этой странице MSDN упоминается, что некоторые объекты недоступны для совместного использования, и будет сгенерировано исключение "значение вне диапазона". http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary(VS.95).aspx

На странице PointCollection также упоминается, что она недоступна для общего доступа. http://msdn.microsoft.com/en-us/library/system.windows.media.pointcollection(VS.95).aspx

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

Ответы [ 3 ]

1 голос
/ 12 января 2012

Я нашел решение здесь : продублируйте PointCollection в получателе.

    private PointCollection sourcePoints;
    public PointCollection SourcePoints
    {
        get
        {
            // create a new instance of PointCollection for binding
            PointCollection newPoints = new PointCollection();
            foreach (Point p in sourcePoints)
            {
                newPoints.Add(p);
            }
            return newPoints;
        }
0 голосов
/ 11 января 2012

Посмотрите на этот вопрос: Почему не работает эта привязка данных?

И на этом тоже: 2-й раз привязка к PointCollection не отображается

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

Я провел некоторое тестирование, и лучшее решение, которое я могу придумать, это:

using System.ComponentModel;
using System.Windows;
using System.Windows.Media;

namespace SilverlightApplication6
{
    public class DemoVM : INotifyPropertyChanged
    {
        #region PointsClone Property
        private PointCollection _pointsClone;
        public PointCollection PointsClone
        {
            get
            {
                return _pointsClone;
            }
            set
            {
                if (_pointsClone != value)
                {
                    _pointsClone = value;
                    OnPropertyChanged("PointsClone");
                }
            }
        }
        #endregion

        #region Points Property
        private PointCollection _points;
        public PointCollection Points
        {
            get
            {
                return _points;
            }
            set
            {
                if (_points != value)
                {
                    _points = value;
                    PointsClone.Clear();
                    foreach (var point in _points)
                    {
                        PointsClone.Add(point);
                    }
                    OnPropertyChanged("Points");
                }
            }
        }
        #endregion

        public DemoVM()
        {
            PointsClone = new PointCollection();
            Points = new PointCollection();
        }

        public void AddPoint(Point point)
        {
            Points.Add(point);
            PointsClone.Add(point);
        }

        public void ClearPoints()
        {
            Points.Clear();
            PointsClone.Clear();
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            var p = PropertyChanged;
            if (p != null)
            {
                p(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Свяжите одну PolyLine.Points с точками, а другую PolyLine.Points с точками Clone.

Это немного уродливо, потому что оно сломается, когда вы используете vm.Points.Add (точка) вместо vm.AddPoint (точка). Применив правильную инкапсуляцию, вы сможете решить эту проблему.

0 голосов
/ 11 января 2012

Возможно, ваша PointCollection заблокирована, и это создает проблему.

MSDN:

Freezable Особенности: поскольку он наследуется от класса Freezable, класс PointCollection предоставляет несколько специальных функций:быть объявленным как ресурсы, совместно используемыми несколькими объектами, сделанными доступными только для чтения для повышения производительности, клонированными и поточно-ориентированными.Для получения дополнительной информации о различных функциях, предоставляемых объектами Freezable, см. Обзор объектов Freezable.

...