Domanda

mi sembra di aver imbattuto in un posto di blocco. Stiamo usando MVVM con Prism e hanno una vista che richiede un inchiostro su tela. Ho creare uno StrokeCollection che viene legato dalla mia ViewModel alla vista. Sono in grado di impostare la raccolta dal mio ViewModel ma le modifiche non sono venuta fino al ViewModel mentre l'utente disegna. C'è un modo per fare questo lavoro?

La mia proprietà nel mio ViewModel è la seguente:

private StrokeCollection _strokes;
public StrokeCollection Signature
{
     get
     {
         return _strokes;
     }
     set
     {
         _strokes = value;
         OnPropertyChanged("Signature");
     }
}

Ecco il mio XAML linea di rilegatura:

<InkCanvas x:Name="MyCanvas" Strokes="{Binding Signature, Mode=TwoWay}" />

Per qualche ragione a quanto pare l'InkCanvas non notifichi ViewModel di ogni modifica.

È stato utile?

Soluzione

Il problema con il vostro approccio è che si assume il InkCanvas crea il StrokeCollection. E non lo fa - aggiunge e rimuove gli elementi da esso solo. E se la raccolta non è disponibile (ad es. È null), il legame non riesce e il InkCanvas non va bene niente con esso. Quindi:

  1. È necessario creare un unico StrokeCollection
  2. È necessario assumere il contenuto della raccolta cambierà, non la raccolta stessa

Esempio di codice:

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

E XAML:

<InkCanvas Strokes="{Binding Signature}"/>

Altri suggerimenti

class StrokeCollection hanno un evento chiamato "StrokesChanged" che è sempre licenziato quando si disegna qualcosa nella vista. Questo evento contiene l'insieme di tratti aggiornati.

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

}

Speranza che aiuta!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top