【发布时间】: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