2011-12-03 4 views
0

Je travaille sur une application WP7 et j'ai eu quelques problèmes pour mettre à jour un TextBlock lié à une propriété. Je suis nouveau à MVVM, et C# en général, donc je ne suis pas sûr de ce que je fais mal. En fin de compte, j'ai résolu ce problème, mais je ne comprends pas pourquoi ma solution fonctionne (toujours amusant ...), donc j'apprécierais vraiment vos conseils.Mise à jour d'une liaison TextBlock

Dans mon application de modèle, j'avais d'abord quelque chose comme ceci:

// Broken 
namespace MyApp.MyModel 
{ 
    public class MetaData : INotifyPropertyChanged 
    { 
     private StatusType status; 
     public StatusType Status 
     { 
      get { return status; } 
      set 
      { 
       status = value; 
       statusMessage = ConvertStatusToSomethingMeaningful(value); 
      } 
     } 

     private string statusMessage; 
     public string StatusMessage 
     { 
      get { return statusMessage; } 
      private set 
      { 
       statusMessage = value; 
       // This doesn't work 
       NotifyPropertyChanged("StatusMessage"); 
      } 
     } 

     ... 
    } 
} 

Status est un enum, et quand il est fixé par mon application, elle fixe également StatusMessage aussi (ce qui est une description plus lisible humaine montrez l'utilisateur). Le TextBlock de My View est lié à StatusMessage, mais il ne se met pas à jour en utilisant le code ci-dessus.

Cependant, si je déplace NotifyPropertyChanged("StatusMessage") en Status, les mises à jour TextBlock de mon View comme il se doit. Cependant, je ne comprends pas pourquoi cela fonctionne quand le code original ci-dessus ne fonctionne pas?

// Fixed 
namespace MyApp.MyModel 
{ 
    public class MetaData : INotifyPropertyChanged 
    { 
     private StatusType status; 
     public StatusType Status 
     { 
      get { return status; } 
      set 
      { 
       status = value; 
       StatusMessage = ConvertStatusToSomethingMeaningful(value); 
       // This works 
       NotifyPropertyChanged("StatusMessage"); 
      } 
     } 

     public string StatusMessage { get; private set; } 

     ... 
    } 
} 

Un grand merci à l'avance pour aider un débutant à :)

+0

Pouvez-vous nous montrer '' ConvertStatusToSomethingMeaningful' et XAML'? –

Répondre

1

question dans cette ligne:

statusMessage = ConvertStatusToSomethingMeaningful(value); 

setter StatusMessage est jamais appelé (NotifyPropertyChanged ("StatusMessage") appelé exactement là)

StatusMessage = ConvertStatusToSomethingMeaningful(value); 

sera le bon choix

probablement ma mise en œuvre de ce serait prochain:

namespace MyApp.MyModel 
{ 
     public class MetaData : INotifyPropertyChanged 
     { 
      private StatusType status; 
      public StatusType Status 
      { 
       get { return status; } 
       set 
       { 
        if (status != value) 
        { 
          status = value; 
          NotifyPropertyChanged("Status"); 
          NotifyPropertyChanged("StatusMessage"); 
        }     
       } 
      } 

      public string StatusMessage 
      { 
       get { return ConvertStatusToSomethingMeaningful(status); } 
      } 

     ... 
     } 
} 
+0

Merci Ku6opr! J'ai complètement manqué ça. Superangel

Questions connexes