代码之家  ›  专栏  ›  技术社区  ›  Tom Deleu

WPF MVVM中的两个“自更新”属性

  •  4
  • Tom Deleu  · 技术社区  · 16 年前

    考虑到您有一个类似WPF的MVVM体系结构 Josh Smith's examples

    如何实现两个相互更新的“同步”属性?我的模型中有Price属性和PriceVatienclusive属性。

    -当价格变化时,我想看到增值税包含价格自动为“价格*1.21”。

    -反之亦然,当pricevaticlusive发生变化时,我希望价格为“pricevaticlusive/1.21”

    有什么想法吗?

    如果您的模型是实体框架实体呢?你不能用上面的方法…不?你应该把计算代码放在视图模型中还是…?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Szymon Rozga    16 年前

    一种方式:

        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
    }
    
        2
  •  0
  •   Arnaud    12 年前

    看一看 Polymod.NET . 如果域对象上有“price”属性,则可以为该域类创建模型,定义公式“pricevat”=price*0.1。模型将知道价格变化时pricevat会发生变化,并将其告知用户界面。

    你的域名类甚至不需要是无效的!