Je veux lier a série de TextBoxes dans une grille en propriétés d'un objet qui est lui-même une autre propriété dans mon ViewModel (le DataContext).
CurrentPerson
se compose des propriétés Name
et Age
à l'intérieur du ViewModel:
public Person CurrentPerson { get; set ... (with OnPropertyChanged)}
Xaml:
<TextBox Text="{Binding Name}" >
<TextBox Text="{Binding Age}" >
Je n'étais pas sûr de l'approche à utiliser, j'ai défini un autre DataContext dans la portée de la grille, sans aucun résultat, j'ai également essayé de définir la source et le chemin d'accès comme Source = CurrentPerson, Path = Age à nouveau sans aucun résultat, ceux-ci étaient pour essai et voir s'il y aurait un changement ou non.
Comment dois-je y parvenir?
Vos Person
membres de la classe Name
et Age
élèvent-ils eux-mêmes l'INPC?
Si vous souhaitez mettre à jour la valeur de Name
ou Age
dans le ViewModel
et la refléter dans la vue, vous en avez besoin pour augmenter la propriété modifiée individuellement dans Person
classe également.
Les liaisons sont correctes mais la vue n'est pratiquement pas notifiée des modifications du modèle de vue. Rappelez-vous également que UpdateSourceTrigger
pour un TextBox
par défaut est LostFocus
, le définir sur PropertyChanged
mettra à jour votre chaîne dans le ViewModel
comme votre saisie .
Exemple simple:
public class Person : INotifyPropertyChanged {
private string _name;
public string Name {
get {
return _name;
}
set {
if (value == _name)
return;
_name = value;
OnPropertyChanged(() => Name);
}
}
// Similarly for Age ...
}
Maintenant, votre xaml serait:
<StackPanel DataContext="{Binding CurrentPerson}">
<TextBox Text="{Binding Name}" />
<TextBox Margin="15"
Text="{Binding Age}" />
</StackPanel>
ou vous pouvez également lier comme suggéré par @Kshitij
<StackPanel>
<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Margin="15"
Text="{Binding CurrentPerson.Age}" />
</StackPanel>
et pour mettre à jour le modèle de vue comme votre saisie
<StackPanel DataContext="{Binding CurrentPerson}">
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Margin="15"
Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
Essaye ça:
<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Text="{Binding CurrentPerson.Age}" />
Essentiellement, vous pouvez explorer les propriétés en utilisant le .
séparateur.
Pour référence future, si vous souhaitez explorer les collections, vous pouvez utiliser MyCollection[x]
comme vous le feriez dans le code (où x serait remplacé par un nombre codé en dur, pas une variable).