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.

¿Fue útil?

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:

  1. Es necesario crear un único StrokeCollection
  2. 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!

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