2011-11-01 5 views
0

J'ai un problème avec la mise à jour du texte de la zone de texte à mon avis. J'ai vu d'autres threads mais je ne peux pas en trouver un qui soit proche de ma configuration.Le texte TextBox lié ne se met pas à jour

J'ai un modèle avec une classe de

interface IPerson : INotifyPropertyChanged 
    { 
     string FirstName { get; set;}  
    } 

    public class Person 
    { 
     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     private string _firstName; 
     public string FirstName 
     { 
      get {return _firstName;} 
      set 
      { 
      _firstName = value; 
      PropertyChanged(this , new PropertChangedEventArgs("FirstName")); 
      } 
     } 
    } 

C'est ce que mon ViewModel ressemble

interface IViewModel : INotifyPropertyChanged 
    { 
     string FirstName { get; set;} 
     IPerson Person { get; set; } 
    } 
    public class viewModel : IViewModel 
    { 
     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     private IPerson _person; 
     public Person Person 
     { 
     get {return _person;} 
     set 
      { 
       _person = value; 
       PropertyChanged(this , new PropertyChangedEventArgs("Person")); 
      } 
     }   
     public string FirstName 
     { 
      get {return Person.FirstName;} 
      Set 
      { 
       Person.FirstName = value; 
       PropertyChanged(this , new PropertChangedEventArgs("FirstName")); 
      } 

     } 
    } 

Xaml Configuration Reliure

// If i use this binding my model will get updated but my textbox text will never show what the value is in the model 
Text="{Binding Path=FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}" 

// This binding works fine both ways 
Text="{Binding Path=Person.FirstName ,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}" 

Donc, si je lie à la personne Tout d'abord, tout fonctionne très bien. Si je lie à FirstName alors il mettra à jour mon modèle mais n'obtiendra pas les données pour le TextBox Text. Cela devient apparent quand je choisis un article dans ma liste.

Est-ce que quelqu'un a une idée pourquoi cela se produirait? Je veux pouvoir me lier au ViewModel Firstname et le faire passer à mon objet person.

+0

Quel est votre DataContext? Selon le code je pense que son viewModel. Donc, si la propriété est modifiée dans Person, les clas viewModel ne seront pas notifiés si vous utilisez Just FirstName. Essayez donc de lancer PropertyChanged dans viewModel. –

+0

Voici comment je fais mon DataContext public EmployeeAdministrationView (IEmployeeAdministrationViewModel vm): this() { DataContext = vm; } –

+0

Je pense par hasard que j'ai juste supprimé le commentaire de quelqu'un. Je m'excuse. Ils m'avaient demandé mes donnéesContext –

Répondre

1

Si votre modèle modifie la valeur FirsName, il déclenche un événement PropertyChanged mais n'est pas étendu (relayé) par ViewModel.

Pour que la première liaison fonctionne, ViewModel doit s'abonner à Person.PropertyChanged, puis déclencher son propre événement lorsque FirstName imbriqué est modifié.

Mais bien sûr, la liaison Path=Person.FirstName est préférable de toute façon.

+0

OK Je vais juste laisser la liaison avec Path = Person.FirstName. Surtout si c'est préférable de toute façon. Merci pour votre aide –

+0

@Bret - pour être clair, c'est la copie de FirstName qui n'est pas souhaitable. Et prendrait encore plus de travail à faire correctement. –

+0

Je ne suis pas sûr de ce que vous voulez dire par copie. J'essayais juste de faire en sorte que mon modèle de vue contienne ma propriété qui serait simplement transmise à la personne. FirstName utilisant les get et les sets. L'ensemble fonctionne parfaitement c'est juste la zone de texte lorsqu'il est lié avec juste le prénom du modèle de vue n'affichera pas le texte. Si je tape du texte, cela met à jour mon modèle qui me déroutait. –

0

Avec cette liaison "Binding Path = Person.FirstName" la vue écoute votre viewModel pour l'événement PropertyChanged. La vue n'écoute pas votre modèle (personne). Si vous définissez le DataContext de votre View sur le viewModel, alors pour que la View connaisse les changements apportés à votre modèle (par exemple, personne), vous devez faire en sorte que votre ViewModel écoute l'événement PropertyChanged de votre modèle. Ensuite, déclenchez l'événement PropertyChanged à partir de votre viewModel.

Questions connexes