La unión a MVVM InkCanvas
Pregunta
Me parece haber topó con un obstáculo en el camino. Estamos utilizando MVVM con Prisma y tienen una visión que requiere un lienzo de tinta. Tengo crear un StrokeCollection que está siendo obligado de mi modelo de vista a la vista. Soy capaz de establecer la colección de mi modelo de vista, pero los cambios no llegan hasta el modelo de vista, mientras que el usuario dibuja. ¿Hay una manera de hacer este trabajo?
Mi Propiedad en mi modelo de vista es el siguiente:
private StrokeCollection _strokes;
public StrokeCollection Signature
{
get
{
return _strokes;
}
set
{
_strokes = value;
OnPropertyChanged("Signature");
}
}
Este es mi línea de unión XAML:
<InkCanvas x:Name="MyCanvas" Strokes="{Binding Signature, Mode=TwoWay}" />
Por alguna razón, al parecer, el InkCanvas nunca se notifica al modelo de vista de cualquier cambio.
Solución
El problema con el enfoque es que usted asume el InkCanvas
crea la StrokeCollection
. No hace - se limita a añadir y elimina los elementos de la misma. Y si la colección no está disponible (es decir. null
es), la unión fallará y el InkCanvas
no quieren hacer lo con él. Por lo tanto:
- Es necesario crear un único
StrokeCollection
- Es necesario asumir el contenido de la colección va a cambiar, no la propia colección
código de ejemplo:
public class ViewModel : INotifyPropertyChanged
{
private readonly StrokeCollection _strokes;
public ViewModel()
{
_strokes = new StrokeCollection();
(_strokes as INotifyCollectionChanged).CollectionChanged += delegate
{
//the strokes have changed
};
}
public event PropertyChangedEventHandler PropertyChanged;
public StrokeCollection Signature
{
get
{
return _strokes;
}
}
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Y XAML:
<InkCanvas Strokes="{Binding Signature}"/>
Otros consejos
clase StrokeCollection tiene un evento denominado "StrokesChanged" que siempre se dispara cuando se dibuja algo en la vista. Ese evento contiene la colección de trazos actualizados.
XAML:
<Grid>
<InkCanvas Strokes="{Binding Signature}"/>
</Grid>
VM:
public class TestViewModel : INotifyPropertyChanged
{
public StrokeCollection Signature { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public TestViewModel()
{
Signature = new StrokeCollection();
Signature.StrokesChanged += Signature_StrokesChanged;
}
void Signature_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e)
{
//PUT A BREAKPOINT HERE AND CHECK
Signature = (System.Windows.Ink.StrokeCollection)sender;
}
}
Espero que ayude!