2008-12-16 13 views
4

Considérant que vous avez une architecture MVVM dans WPF comme Josh Smith's examplesDeux propriétés « auto-mise à jour » dans WPF MVVM

Comment voulez-vous mettre en œuvre deux propriétés « synchronisées » qui mettent à jour eachother? J'ai une propriété Price et une propriété PriceVatInclusive dans mon modèle.

-Lorsque le prix change, je veux que le prix TTC soit automatiquement 'Prix * 1.21'.

-Vice versa, lorsque les changements PriceVatInclusive, je veux le prix à 'PriceVatInclusive/1,21'

Toutes les idées sur ce sujet?

Et si votre modèle est un framework Entity entièrement? Vous ne pouvez pas utiliser l'approche ci-dessus alors ... non? Devriez-vous mettre du code de calcul dans le ViewMOdel ou ...?

Répondre

4

Une façon:

public class Sample : INotifyPropertyChanged 
    { 
     private const double Multiplier = 1.21; 
     #region Fields 
     private double price; 
     private double vat; 
     #endregion 

     #region Properties 
     public double Price 
     { 
      get { return price; } 
      set 
      { 
       if (price == value) return; 
       price = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("Price")); 
       Vat = Price * Multiplier; 
      } 
     } 

     public double Vat 
     { 
      get { return vat; } 
      set 
      { 
       if (vat == value) return; 
       vat = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("Vat")); 
       Price = Vat/Multiplier; 
      } 
     } 
     #endregion 

     #region INotifyPropertyChanged Members 
     protected void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      PropertyChangedEventHandler ev = PropertyChanged; 
      if (ev != null) 
      { 
       ev(this, e); 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 

Si vous pouvez tirer de DependencyObject, vous pouvez utiliser des propriétés de dépendance.

public class Sample : DependencyObject 
{ 
    private const double Multiplier = 1.21; 

    public static readonly DependencyProperty VatProperty = 
     DependencyProperty.Register("Vat", typeof(double), typeof(Sample), 
     new PropertyMetadata(VatPropertyChanged)); 

    public static readonly DependencyProperty PriceProperty = 
     DependencyProperty.Register("Price", typeof(double), typeof(Sample), 
     new PropertyMetadata(PricePropertyChanged)); 

    private static void VatPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     Sample sample = obj as Sample; 
     sample.Price = sample.Vat/Multiplier; 
    } 

    private static void PricePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     Sample sample = obj as Sample; 
     sample.Vat = sample.Price * Multiplier; 
    } 

    #region Properties 
    public double Price 
    { 
     get { return (double)GetValue(PriceProperty); } 
     set { SetValue(PriceProperty, value); } 
    } 

    public double Vat 
    { 
     get { return (double)GetValue(VatProperty); } 
     set { SetValue(VatProperty, value); } 
    } 
    #endregion 
} 
+0

Oui ok, mais que se passe-t-il si votre modèle est un framework Entity entièrement? Vous ne pouvez pas utiliser l'approche ci-dessus alors ... non? Devriez-vous mettre du code de calcul dans le ViewMOdel ou ...? –

+0

Attention à M. Infinite Loop avec le premier exemple! – Arcturus

0

Jetez un oeil à Polymod.NET. Si vous avez une propriété 'Prix' sur un objet de domaine, vous pouvez créer un modèle pour cette classe de domaine, définir une formule 'PriceVat' = Prix * 0.1. Le modèle saura que PriceVat change lorsque le prix change et en informera l'interface utilisateur.

Votre classe de domaine ne doit même pas être INotifyable!