2013-07-02 1 views
0

Je suis un peu nouveau à l'idée de liaisons en C#. J'ai actuellement une application utilisant MVVM sur laquelle je travaille. Dire que j'ai, par exemple, une liste comme ceci:Mettre à jour la source de données du contrôle

List<string> Items = new List<string>() 
{ 
    "Item1", 
    "Item2", 
    "Item3", 
} 

Bound à cette liste sont trois zones de texte comme ceci:

Dans le XAML:

<TextBox Name="TextBox1" text="{Binding TextSource1 Mode=TwoWay}"> 
<TextBox Name="TextBox2" text="{Binding TextSource2 Mode=TwoWay}"> 
<TextBox Name="TextBox3" text="{Binding TextSource3 Mpde=TwoWay}"> 

Et dans le code:

Public string TextSource1 
{ 
    get { return Items[0]; } 
    set { Items[0] = value; } 
} 
Public string TextSource2 
{ 
    get { return Items[1]; } 
    set { Items[1] = value; } 
} 
Public string TextSource3 
{ 
    get { return Items[2]; } 
    set { Items[2] = value; } 
} 

Dites que la valeur affichée dans la première zone de texte est actuellement "Item1" comme dans la liste. De là, l'utilisateur le change en "Item4". Comment pourrais-je mettre à jour la liste de cela? Est-ce qu'il se met automatiquement à jour s'il est réglé sur TwoWay?

Je sais que dans le code si je devais changer une valeur dans la liste, dites:

Items[2] = "Item4"; 

je peux mettre à jour la zone de texte en appelant

RaisePropertyChanged("TextSource3"); 

Mais ce n'est pas d'un grand secours moi en ce moment.

+0

Désolé, mais quelle est la question? – Bolu

+0

@Bolu Avez-vous lu le tout? J'ai demandé: "Dites que la valeur affichée dans la première zone de texte est actuellement" Item1 "telle qu'elle est dans la liste.A partir de là, l'utilisateur la change en" Item4 ".Comment pourrais-je mettre à jour la liste de cela? Met-il automatiquement à jour s'il est réglé sur TwoWay? " – DanteTheEgregore

+0

Vous devez augmenter votre événement" RaisePropertyChanged "dans votre jeu de propriétés –

Répondre

1

Il y a un certain nombre de choses à noter. D'abord quand par défaut, un TextBox ne propagera pas les changements de texte jusqu'à ce qu'il perd le focus. Cela peut se produire si vous supprimez le contrôle ou cliquez sur un autre contrôle pouvant recevoir le focus (comme l'autre TextBoxes).

Vous pouvez modifier ce comportement en réglant le UpdateSourceTrigger sur la Binding (vous pas non plus besoinMode=TwoWay sur un TextBox car il est le mode par défaut):

<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" /> 

La seconde est que vos propriétés besoin d'augmenter l'événement PropertyChanged dans leur setter. Bien que ce ne soit pas strictement nécessaire pour qu'un seul Binding fonctionne, vous devez le faire au cas où vous décidiez d'avoir d'autres contrôles liés à la même propriété.

1

Changer le type d'éléments à ObserableCollection<String>

Changer la liaison de zone de texte à:

<TextBox Name="TextBox1" text="{Binding Items[0], Mode=TwoWay}"> 
<TextBox Name="TextBox2" text="{Binding Items[1], Mode=TwoWay}"> 
<TextBox Name="TextBox3" text="{Binding Items[2], Mpde=TwoWay}"> 

En raison du mécanisme de notification interne de ObservableCollection, lorsque vous modifiez un de ses éléments, il avisera l'interface utilisateur.

+0

J'aime votre réponse mais je cherchais un moyen de mettre à jour l'élément de l'interface utilisateur.Ne pas un moyen de mettre à jour l'interface utilisateur de l'élément – DanteTheEgregore

+1

Vous peut absolument mettre à jour les données sur ViewModel à partir de TextBox La question est de savoir si vous voulez une logique supplémentaire dans la notification de l'interface utilisateur Avantages de l'utilisation de propriétés séparées wrapping index de collection est que vous pouvez ajouter de la logique dans les setters. ing s'applique directement à la collection, vous devez ajouter un écouteur d'événement. Cependant, je n'ai pas vu ce cas dans votre code. –

0

Dites que la valeur affichée dans la première zone de texte est actuellement "Item1" comme dans la liste. De là, l'utilisateur le change en "Item4". Comment pourrais-je mettre à jour la liste de cela? Est-ce qu'il se met automatiquement à jour s'il est réglé sur TwoWay?

Oui, il met à jour automatiquement lorsque le focus perte.

Questions connexes