Dibujo de dos polilíneas de una excepción de colección de puntos (Silverlight 5)
-
27-10-2019 - |
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.
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.