2017-02-22 57 views
0

我正试图在我的应用程序中实现购物车系统,这被证明比我预期的更困难/困难。购物车是模型还是视图模型?

目前我的实现是这样的:

public class CartItem 
{ 
    public Product Product { get; set; } 
    public int Quantity { get; set; } 
    public decimal Subtotal { get { return Quantity * Product.Price; } } 
} 

public class Cart 
{ 
    public ObservableCollection<CartItem> CartItems { get; set; } 
    public int ItemCount { get; set; } 
    public decimal Total { get; set; } 
    public ICommand AddItemCommand { get; set; } 
    public ICommand RemoveItemCommand { get; set; } 
    public void AddItem(Product product) 
    { 
    } 
    public void RemoveItem(Product product) 
    { 
    } 
} 

具体来说,我有一个困难时期试图找出它属于MVVM模式中。此实现将一直运行,直到CartItem上的Quantity变量被其所属的Cart(例如视图)以外的内容修改。

一些问题,我问自己:

  • 是购物车对象的抽象?是=>这是一个模型。
  • 它会被序列化/反序列化到数据库和从数据库中?是的,所以它仍然是一个模型。
  • 它是否将数据提供给视图?是。这是一个视图模型。
  • 它是否采取行动或修改该数据?是的,所以这是一个视图模型。
+1

** CartItem **肯定是一个模型。 **购物车**是更多的视图将绑定到一个控制器,所以把它放在ViewModel –

+0

所以是你的实际问题“如何更新**视图上的Cart.ItemCount'和'Cart.Total' * *,当CartItem.Quantity在Cart.CartItems集合中存储的CartItem的一个上发生变化时?或“这些类当前代表的MVVM模式的哪些部分:Model,ViewModel或View?” – Teknikaali

+0

是的。我的意思是,不。肯定是哟。可能内斯。也许。 – Will

回答

0

我要说的是我看MVVM的方式,也许它不完全准确,但我已经看到其他人也这么想。

在我看来,Cart和CartItem都是Model。

当我构建MVVM应用程序我有:

  1. 查看:只有无码XAML背后
  2. 视图模型:其中包含一个或几个模型对象以及其他一些性质
  3. 模型:这似乎是一个DTO模型,每个属性实现INotifyPropertyChanged(或RaisePropertieChanged,如果您使用MVVM-Light P lugin)。

    该模型可以有一些“助手属性”。例如,您的“小计”属性。

  4. DomainModel:这是您的数据库中的数据。基本上你的DomainModel与你的表具有相同的结构(或多或少)

很明显,还有一个服务层,但这不是重点。

要将模型映射到DomainModel,我使用Automapper。这很简单。

您可以合并模型和DomainModel图层,但personnaly我不喜欢这样。 无论如何,我使用PocoGenerator库,因此每次更新我的数据库结构时,MVVM代码都会被擦除。

最后一件事,我发现使用MVVM-Light非常有帮助。但是,这又是我的看法。

编辑:

我忘了: 我认为ICommand接口和方法不应该存在。所有的ICommand必须放置在ViewModel类中。