2010-12-14 83 views
0

Ceci est mon ViewModel -WPF, reliure et datacontext

public class ViewModel 
{ 
    public ObservableCollection<Person> Persons { get; set; } 
} 

et c'est classe Personne:

public class Person : INotifyPropertyChanged 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      _firstName = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Maintenant, chaque fois que l'un des prénom de personnes est en train de changer, je veux faire quelques tâches , permet de lever un messagebox.

Comment faire cela?

Répondre

1

Vous devez mettre en œuvre INotifyPropertyChanged

public class Person : INotifyPropertyChanged 
{ 
    private string firstName; 
    public string FirstName 
    { 
     get { return this.firstName;} 
     set 
     { 
      this.firstName = value; 
      this.RaisePropertyChanged("FirstName"); 
      MessageBox.Show("Hello World"); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

protected void RaisePropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
    if ((propertyChanged != null)) 
    { 
     propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+1

La façon dont vous affichez le MessageBox n'a rien à voir avec Binding/DataContext ou INotifyPropertyChanged; ma conjecture est l'OP cherchait plus alors un MessageBox.Show() dans le setter d'une propriété –

+0

@ Aaron - oh vraiment Aaron, eh bien, je ne vois pas comment vous pouvez interpréter, "Maintenant, chaque fois l'un des personnes de FirstName est en train de changer Je veux faire quelques tâches, disons, élever une boîte à messages, comment faire ça? ", De toute autre manière. Si vous avez de grandes idées, pourquoi ne postez-vous pas une réponse à la place de votre opinion? – Gabe

+0

Si la question n'était pas claire, demandez l'OP pour plus d'informations. Je faisais simplement remarquer cela afin que vous puissiez peut-être nous fournir un itinéraire supplémentaire qui tienne compte de ces éléments. –

1

Généralement votre classe personne utilisera l'interface INotifyPropertyChanged, déclenchant l'événement PropertyChanged chaque fois que des changements FirstName. Cela vous permet de lier des éléments dans une vue à votre classe Person et la vue sera mise à jour lorsque les données seront modifiées.

Pour faire apparaître une boîte de message quand un prénom, cependant, vous aurez besoin de code derrière votre vue. Une façon de le faire est de, comme précédemment, utiliser INotifyProperty modifié et vous abonner à cela sur tous les objets Person dans votre vue, en utilisant MessageBox.Show chaque fois qu'un événement qui change FirstName est appelé. Vous pouvez utiliser l'événement CollectionChanged dans ObservableCollection pour suivre les objets Person dans et hors de la liste pour vous assurer qu'ils sont tous connectés à votre gestionnaire d'événement modifié Person FirstName. À mon avis, la meilleure façon de le faire est d'avoir un événement dans le ViewModel plutôt que la classe Person qui se déclenche chaque fois qu'une modification est apportée à une classe Person (avec l'objet Person spécifique en argument). Cela ne fonctionnera que si le ViewModel est la seule chose qui peut changer Person.FirstName, et votre View devra se lier au ViewModel d'une manière appropriée pour effectuer ceci.