2010-05-21 6 views
1

J'essaye de lier la propriété 'Content' d'une étiquette à une propriété de quelque type personnalisé que j'ai; Malheureusement, je n'ai pas compris comment le faire, et c'est pourquoi je suis ici :)Lier le contrôle WPF avec la propriété du type personnalisé

Supposons que j'ai le type suivant (peut être dans le même espace de noms que ma fenêtre WPF qui contient l'étiquette ou différents espaces de noms):

namespace MyNS 
{ 
    pubic class Person 
    { 
     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
     } 

     public void GetOlder 
     { 
      age++; 
     } 
    } 
} 

1) Comment je lier mon étiquette à la propriété 'âge?

2) Au moment de l'exécution, je vais créer une instance de 'Person'; Je veux m'assurer que mon Label est lié à la bonne instance; à savoir si j'ai appelé:

Person SomePerson = new Person(); 
SomePerson.GetOlder(); 

Je veux que mon Lable d'avoir la nouvelle valeur de la propriété « âge » pour « SomePerson ».

3) Que se passe-t-il si j'appelle 'GetOlder' dans un thread différent (que ce soit en utilisant le thread Dispatcher ou BackgroundWorker)? Vais-je encore obtenir la dernière valeur de 'Age'? Ou dois-je aussi prendre soin d'autres choses pour rendre ce scénario possible?

Merci à l'avance,

TheBlueSky

Répondre

1

Il est avéré être genre de chose simple, je me demande pourquoi personne ne répondit :) Quoi qu'il en soit, voici les réponses:

1) D'abord, nous besoin de créer notre classe Person comme ceci:

using System.ComponentModel; 

namespace MyNS 
{ 
    pubic class Person : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private int age = 0; 

     public int Age 
     { 
      get { return age; } 
      set 
      { 
       age = value; 
       OnPropertyChanged("Age"); 
      } 
     } 

     protected void OnPropertyChanged(string PropertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(PropertyName)); 
      } 
     } 

     public void GetOlder 
     { 
      Age++; 
     } 
    } 
} 

2) Ensuite, nous engageons notre contrôle WPF à la propriété Person.Age comme ceci:

using System.Windows.Data; 

//... 

Person p = new Person(); 
Binding ageBinding = new Binding("Age"); 
ageBinding.Source = p; 
MyWpfLabelControl.SetBinding(Label.ContentProperty, ageBinding); 

Maintenant, lorsque p.GetOlder() s'appelle MyWpfLabelControl.Content, la nouvelle valeur de p.Age est modifiée.

3) Dans le multithreading, l'histoire n'est pas différente; ça va travailler de la même façon lors de l'appel p.GetOlder() dans un autre thread:

new Thread(
    new ThreadStart(
     delegate() { 
      p.GetOlder(); 
     } 
)).Start(); 

Hope this helps.

TheBlueSky

Questions connexes