Два «самообновляющихся» свойства в WPF MVVM - PullRequest
4 голосов
/ 16 декабря 2008

Учитывая, что у вас есть архитектура MVVM в WPF, как Примеры Джоша Смита

Как бы вы реализовали два «синхронизированных» свойства, которые обновляют друг друга? У меня есть свойство Price и свойство PriceVatInclusive в моей модели.

-При изменении цены я хочу, чтобы цена с учетом НДС автоматически составляла «Цена * 1,21».

- наоборот, когда PriceVatInclusive изменяется, я хочу, чтобы Price была 'PriceVatInclusive / 1.21'

Есть идеи на этот счет?

А что, если ваша модель является Entity Framework Entity? Вы не можете использовать подход выше, тогда ... нет? Вы должны поместить расчетный код в ViewMOdel или ...?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2008

В одну сторону:

    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
    }

Если вы можете получить из DependencyObject, вы можете использовать свойства зависимости.

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 голосов
/ 26 апреля 2012

Взгляните на Polymod.NET . Если у вас есть свойство Price в доменном объекте, вы можете создать модель для этого доменного класса, определив формулу PriceVat = Price * 0,1. Модель будет знать, что PriceVat изменяется при изменении Price, и сообщит об этом пользовательскому интерфейсу.

Ваш класс домена даже не должен быть INotifyable!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...