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.
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:
- Vous devez créer un seul
StrokeCollection
- 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!