Question

Il me semble avoir couru dans un barrage routier. Nous utilisons MVVM avec Prism et avoir une vue qui nécessite une toile d'encre. J'ai créer un StrokeCollection qui est lié de mon ViewModel à la vue. Je suis en mesure de mettre la collection de mon viewmodel mais les changements ne viennent pas à la ViewModel pendant que l'utilisateur tire. Y at-il un moyen de faire ce travail?

Ma propriété dans mon ViewModel est la suivante:

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

Voici ma XAML ligne de reliure:

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

Pour une raison apparemment jamais InkCanvas informe ViewModel de tout changement.

Était-ce utile?

La solution

Le problème avec votre approche est que vous assumez le InkCanvas crée le StrokeCollection. Il ne fonctionne pas - il ne fait qu'ajouter et supprime les éléments de celui-ci. Et si la collection ne sont pas disponibles (ie. Est null), la liaison échouera et la InkCanvas ne fera pas quoi que ce soit avec elle. Donc:

  1. Vous devez créer un seul StrokeCollection
  2. Vous devez assumer le contenu de la collection va changer, pas la collection elle-même

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

Et XAML:

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

Autres conseils

classe StrokeCollection ont un événement appelé « StrokesChanged » qui est toujours déclenché lorsque vous dessinez quelque chose dans la vue. Cet événement contient la collection de coups mises à jour.

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

}

it helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top