web-dev-qa-db-fra.com

liaison à une propriété d'un objet

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?

14
LastBye

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>
21
Viv

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).

15
K Mehta