Pregunta

Estoy usando Silverlight 5 con MVVM.

Tengo un model de vista que es un único. El modelado de vistas expone un PointCollection que estoy usando para dibujar un Polyline en uno de mis puntos de vista.

Si trato de dibujar lo mismo Polyline en una segunda vista, databinding to the PointCollection Nuevamente, obtengo una excepción de "el valor no cae dentro del rango esperado".

Por lo que pude descubrir (con mi conocimiento limitado de Silverlight), esto es causado por el hecho de que PointCollections no son compartibles.

¿Hay una solución alternativa? ¿Cómo puedo obtener una segunda polilínea dibujada que sea idéntica a la primera? Yo quiero databind dos polilíneas para una colección de puntos al mismo tiempo.

Editar: no he encontrado una solución, pero alguien con el mismo problema aquí. Según Microsoft:

Esta página de MSDN menciona que algunos objetos no se pueden compartir y generarán una excepción de "valor fuera de rango". http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary(VS.95).aspx

La página de PointCollection también menciona que no se puede compartir. http://msdn.microsoft.com/en-us/library/system.windows.media.pointcollection(VS.95).aspx

Actualmente, esto es por comportamiento de diseño. Sin embargo, estamos evaluando esto para ver si podemos cambiar el comportamiento o al menos el texto de excepción.

¿Fue útil?

Solución

Eche un vistazo a esta pregunta: ¿Por qué no funciona este enlace de datos?

Y en este también: Segunda vez que se une a PointCollection no se está renderizando

Como dio pequeños detalles, no estoy muy seguro de lo que está sucediendo, pero estas publicaciones pueden ayudar. Si no, publique su código.

Hice algunas pruebas y la mejor solución que se me ocurre es esta:

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));
            }
        }
    }
}

Unir una polilínea. Puntos a los puntos y los otros puntos de polilínea a PointsClone.

Es un poco feo porque se romperá cuando use vm.points.add (punto) en lugar de vm.addpoint (punto). Al aplicar la encapsulación adecuada, puede resolver eso.

Otros consejos

Encontré una solución aquí: duplicar la colección de puntos en el Getter.

    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;
        }

Tal vez su colección de puntos se congele y eso está causando problemas.

MSDN:

Características congelables: debido a que hereda de la clase congelable, la clase PointCollection proporciona varias características especiales: los objetos de PointCollection se pueden declarar como recursos, compartidos entre múltiples objetos, hechos de solo lectura para mejorar el rendimiento, clonados e hechos a prueba de subprocesos. Para obtener más información sobre las diferentes características proporcionadas por los objetos congelables, consulte la descripción general de los objetos congelables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top