2017-03-03 1 views
1

Nous développons une application UWP à l'aide de Template10. L'application affiche Coût, Net, Taxe et Total correctement. Tax et Total sont des propriétés calculées dans ViewModel. Cependant, lorsque Net est mis à jour dans ViewModel, Tax et Total sont mis à jour dans ViewModel mais pas mis à jour dans la vue. Le Xaml:Dans UWP, les propriétés calculées en lecture seule ne sont pas mises à jour dans la vue

<TextBlock 
    Text="{x:Bind ViewModel.Net,Mode=OneWay}" 
/> 
<TextBlock 
    Text="{x:Bind ViewModel.Tax,Mode=OneWay}" 
/> 
<TextBlock 
    Text="{x:Bind ViewModel.Total,Mode=OneWay}" 
/> 

ViewModel:

public class ViewModel : ViewModelBase 
{ 
     decimal? _Net = default(decimal?); 
     public decimal? Net 
     { 
      get 
      { 
       return _Net; 
      } 
      set 
      { 
       if (value == 0) value = null; 
       Set(ref _Net, value); 
      } 
     } 

     decimal? _TaxRate = default(decimal?); 
     public decimal? TaxRate { get { return _TaxRate; } set { Set(ref _TaxRate, value); } } 

     public decimal? Tax 
     { 
      get 
      { 
       return TaxRate/100 * Net; 
      } 
     } 

     public decimal? Total { get { return Net + Tax; } } 

Nous avons une commande dans le ViewModel qui édite Net

DelegateCommand _SetDiscount; 
public DelegateCommand SetDiscount 
     => _SetDiscount ?? (_SetDiscount = new DelegateCommand(() => 
     { 
    // for simplicity deleted calculations for the newNet 
      this.Net = newNet ?? 0; 
},() => true)); 

net, impôt et Total sont correctement mis à jour dans le ViewModel. Net est correctement mis à jour dans la vue. Pourquoi Tax et Total ne sont-ils pas mis à jour dans la vue?

+1

Où êtes-vous bien levez changer pour Taxe et Total? Je pense qu'après 'Set (ref _Net, value);' vous devriez avoir 'RaisePropertyChanged (nameof (Tax)); RaisePropertyChanged (nameof (Total)); '. – Romasz

+0

Bonne question @Romasz. Comment puis-je faire cela avec des propriétés calculées? ... whoops ... juste eu votre édition. – Vague

+0

J'ai modifié le premier commentaire. Avez-vous une méthode publique/protégée/interne responsable du changement de propriété, ou seulement 'Set()'? – Romasz

Répondre

2

Ils ne sont pas mis à jour dans le Voir car vous ne l'informez pas de la modification. Votre méthode Set() a l'intérieur d'une méthode RaisePropertyChanged(string) (ou quelque chose de similaire invoquant PropertyChanged événement) afin que votre changement de valeur Net est affiché, il suffit d'ajouter à Net informations sur le changement setter pour les deux autres:

public decimal? Net 
{ 
    get 
    { 
     return _Net; 
    } 
    set 
    { 
     if (value == 0) value = null; 
     Set(ref _Net, value); 
     RaisePropertyChanged(nameof(Total)); 
     RaisePropertyChanged(nameof(Tax)); 
    } 
}