Frage

Ich scheine zu haben, lief in eine Straße blockieren.Wir sind mit MVVM mit Prism und haben einen Blick auf das verlangt, dass eine Tinte Leinwand.Ich habe erstellen Sie eine StrokeCollection, die gebunden wird, von meinem ViewModel an die Ansicht.Ich bin in der Lage, die Sammlung von meinem viewmodel, aber die änderungen kommen nicht bis zu dem ViewModel, während der Benutzer zieht.Gibt es eine Möglichkeit, diese Arbeit zu machen?

Meine Eigenschaft in meinem ViewModel wie folgt:

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

Hier ist mein XAML-Bindung line:

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

Für einige Grund, scheinbar das InkCanvas-nie benachrichtigt ViewModel zu einer änderung.

War es hilfreich?

Lösung

Das problem mit Ihrem Ansatz ist Sie annehmen, dass Sie die InkCanvas legt der StrokeCollection.Es funktioniert nicht - es werden lediglich Hinzugefügt und entfernt Elemente aus es.Und wenn die Sammlung nicht verfügbar ist (dh.ist null), wird die Bindung fehl, und die InkCanvas nicht alles mit es.Also:

  1. Sie müssen zum erstellen einer einzelnen StrokeCollection
  2. Sie müssen davon ausgehen, der Inhalt der Sammlung wird sich ändern, nicht die Sammlung selbst

Beispiel-code:

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

Und XAML:

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

Andere Tipps

StrokeCollection Klasse haben eine Veranstaltung namens "StrokesChanged" wird immer ausgelöst, wenn Sie etwas zeichnen in der Ansicht.Das Ereignis enthält die Sammlung von Strichen aktualisiert.

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

}

Hoffe, es hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top