2010-12-15 74 views
1

Relativement nouveau à WPF, alors portez-moi si je manque quelque chose d'évident. Je travaille sur la création d'une zone de texte "résumé" en bas de la fenêtre qui décrit l'état de l'application. Le code de la propriété que je veux lier à ressemble un peu à ceci:WPF TextBox liaison à plusieurs sources

public String WindowDescription 
{ 
    get { return (radioButton.IsChecked == true ? "A " : "B ") + NameTextBox.Text 
+ " " + (cbRoute.SelectedItem != null? comboBox.SelectedItem.ToString() : ""); } 
} 

Et je l'ai lié au contrôle comme si:

<TextBox IsEnabled="False" Text="{Binding Path=WindowDescription}"/> 

La liaison ne fonctionne pas du tout maintenant - chaque contrôle référencé dans WindowDescription a une valeur par défaut, mais même ces valeurs ne peuplent pas la TextBox. Comme je l'ai dit, je suis nouveau à WPF, alors n'hésitez pas à signaler tout ce qui manque à mon exemple, aussi évident que cela puisse paraître. Merci.

+0

Regardez la sortie de débogage de votre application. Y at-il des erreurs de liaison? – Jens

Répondre

1

Un couple de choses. Tout d'abord, assurez-vous que votre DataContext est défini sur l'instance de la classe qui contient la propriété WindowDescription.

Normalement, ceci est défini dans le codebehind de la page. Il peut aussi être défini en XAML, mais je ne compliquerai pas ma réponse.

Deuxièmement, la liaison de données ne voit pas automatiquement les changements de valeur de propriété. Un système de notification doit être configuré dans la classe avec la propriété WindowDescription.

Google "INotifyPropertyChanged" avec Bing et voir.

Sinon, regardez cette vidéo!

http://channel9.msdn.com/blogs/mtaulty/silverlight-databinding-ui-to-net-classes

Luke

+0

C'était la clé pour trouver une solution. J'ai fini par créer une classe privée qui liait une propriété à chaque contrôle, et dans le setter de chacune de ces propriétés, elle mettait "this.Summary = getSummary()" qui générait la chaîne, puis la plaçait dans this.Summary, dont setter a créé NotifyPropertyChangedEvent, mettant ainsi à jour la boîte de texte chaque fois qu'un contrôle a été modifié. Merci! –

0

Si je devais deviner, je suppose que vous n'avez pas défini le DataContext de votre TextBox (soit directement, soit en en fournissant un pour ses parents quelque part).

Le chemin de liaison est relatif aux éléments DataContext, et le DataContext par défaut est null (et non l'élément lui-même ou sa fenêtre contenant).

0

Je devine que Jens est juste, avez-vous mis le modèle? à savoir

this.DataContext = model; 

Si vous modèle est rien, dans notre cas où je travaille, nous utilisons de et le motif de MVVM ViewModel. Vous pourriez regarder à plus long terme quelque chose comme Prism et Unity, mais si vous mettez simplement tout votre code dans le fichier .cs pour la page XAML, voici un exemple.

namespace DataContextTest 

{

public partial class MainWindow: Fenêtre { MainWindow public() { this.DataContext = this; MyString = "Salut à tous ..."; InitializeComponent(); }

public string MyString { get; set; } 

} }

Puis, dans la liaison XAML à MaChaîne comme vous l'avez fait dans l'autre poste et cela devrait fonctionner, bien sûr, encore une fois - il n'y a pas de notification de changement à ce stade.Je peux poster un exemple de cela si vous le souhaitez, mais je pense que vous pouvez google et voir beaucoup d'exemples simples.

J'espère que cela a été utile.