【问题标题】:How to stop properties from resetting如何阻止属性重置
【发布时间】:2019-04-23 12:55:16
【问题描述】:

在我的 BaseViewModel 上,我有一个名为 OrderService 的静态类,它有一个订单集合,每个 Order 都有一个 IFoodItems 集合。当我调用AddOrder 方法并传递命令时,它会正确保存它并且IFoodItems 上的属性值是正确的。当我在不同的 ViewModel 上调用我的 GetOrders 方法时,IFoodItems 上的 Quantity 属性被重置为零,我不希望这种情况发生。怎样才能保值?

我尝试将列表设为静态,在添加食物列表之前捕获它,然后使用 MessageCenter 类发送它。

视图模型:

class TakeOrderViewModel : BaseViewModel
    {
        #region Properties
        private double _orderPrice;
        ObservableCollection<IFoodItems> _FoodList; 

        public ObservableCollection<IFoodItems> FoodList {
            get { return _FoodList; }
            set {
                SetProperty<ObservableCollection<IFoodItems>>(ref _FoodList, value);
            }
        }
        public ICommand SaveOrderCommand { get; private set;}
        public double OrderPrice 
        {
            get { return _orderPrice; }
            set {
                SetProperty<double>(ref _orderPrice, value);
            }
        }
        #endregion

        public TakeOrderViewModel()
        {
            FoodList = menuService.getMenu();
            OrderPrice = 0;
            SaveOrderCommand = new Command<string>(SaveOrder);
        }

        public void SaveOrder(string name)
        {
            Order CustomerOrder = new Order(name);            
            if(IsOrderEmpty())
            {
                App.Current.MainPage.DisplayAlert("Error", "The order has no quantity.", "OK");
            }
            else
            {
                foreach (IFoodItems item in FoodList)
                {
                    if(item.Quantity > 0)
                    {
                        CustomerOrder.AddItem(item);
                    }

                }
                CustomerOrder.SetPrice(OrderPrice);
                //MessagingCenter.Send<TakeOrderViewModel, Order>(this, "orderSender", CustomerOrder);
                OrderService.AddOrder(CustomerOrder);
                App.Current.MainPage.DisplayAlert("Message", "Order has been saved", "OK");
                //ClearOrder();
            }            
        }
        public bool IsOrderEmpty()
        {
            double temp = 0;
            foreach (IFoodItems item in FoodList)
            {
                temp += item.Quantity;
            }
            if (temp == 0)
                return true;
            else
                return false;

        }              
        public void ClearOrder()
        {
            foreach(IFoodItems item in FoodList)
            {
                item.Quantity = 0;
            }
            OrderPrice = 0;
        }
    }

订单服务:

 public class OrderService
    {
        ObservableCollection<Order> OrderList;
        public OrderService()
        {
            OrderList = new ObservableCollection<Order>();
        }

        public void AddOrder(Order value)
        {
            //one of the ways i tried to preserve the values
            ObservableCollection<IFoodItems> foods = value.foodItems;
            OrderList.Add(new Order(foods,value));
            //OrderList.Add(value);
        }
        public ObservableCollection<Order> GetOrders()
        {
            return OrderList;
        }

订单类别:

 public class Order
    {
        public string Name { get; set; }
        public ObservableCollection<IFoodItems> foodItems;
        public double Price { get; set; }
        public string PriceString { get; set; }

        public Order(string name)
        {
            Name = name;
            foodItems = new ObservableCollection<IFoodItems>();
        }
        public Order(ObservableCollection<IFoodItems> order, Order val)
        {
            this.Name = val.Name;
            this.foodItems = order;
            this.Price = val.Price;
            this.PriceString = val.PriceString;
        }
        public void SetPrice(double value)
        {
            Price = value;
            PriceString = "Price: " + Price + " tickets";
        }
        public void AddItem(IFoodItems food)
        {
            foodItems.Add(food);
        }
    }

IFoodItem:

public interface IFoodItems : INotifyPropertyChanged
    {
        int Quantity { get; set; }
        double Weight_lbs { get; }
        double TicketPrice { get; }
        string Name{ get; set; }

        double GetDollarsMade();
        double GetTicketPrice();
        double GetAmountUsed();
    }

基础视图模型:

public class BaseViewModel : INotifyPropertyChanged
    {
        protected MenuService menuService;
        protected static OrderService OrderService;

        public BaseViewModel()
        {
            menuService = new MenuService();
            OrderService = new OrderService();
        }
        #region INotifyPropertyChanged
        protected bool SetProperty<T>(ref T backingStore, T value,
            [CallerMemberName]string propertyName = "",
            Action onChanged = null)
        {
            if (EqualityComparer<T>.Default.Equals(backingStore, value))
                return false;

            backingStore = value;
            onChanged?.Invoke();
            OnPropertyChanged(propertyName);
            return true;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            var changed = PropertyChanged;
            if (changed == null)
                return;

            changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }

【问题讨论】:

  • 如果您的服务在此,您能否发布BaseViewModel 的代码。
  • @JSteward 我用 BaseViewModel 更新了帖子

标签: c# xamarin.forms


【解决方案1】:

每次您继承 BaseViewModel 并实例化后代时,都会调用基本构造函数并创建 OrderService 的新实例。

protected static OrderService OrderService = new OrderService();

并将其从构造函数中移除。

【讨论】:

  • 编辑:它刚刚开始工作!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多