如何反映视图模型中应用服务器模型中所做的更改?

时间:2011-11-18 13:52:17

标签: c# wpf wcf mvvm

大家。

序言。 让我们来看看这种典型情况。这是3层应用程序:

  • WPF(或Silverlight,无所谓)客户端,基于MVVM构建;
  • WCF服务(应用程序服务器);
  • 一些RDBMS作为存储。

以下是简单的“订单商品”域名模型:

[DataContract(IsReference = true)]
public class Order : INotifyPropertyChanged
{
    [DataMember]
    public Int32 Id { ... }
    [DataMember]
    public Decimal Total { ... }
    [DataMember]
    public Decimal Discount { ... }
    [DataMember]
    public ObservableCollection<OrderItem> Items { ... }
}

[DataContract(IsReference = true)]
public class OrderItem : INotifyPropertyChanged
{
    [DataMember]
    public Int32 Id { ... }
    [DataMember]
    public String Name { ... }
    [DataMember]
    public Decimal Price { ... }
    [DataMember]
    public Decimal Quantity { ... }
    [DataMember]
    public Order Order { ... }
    [DataMember]
    public Int32 OrderId { ... }
}

属性Order.Id和OrderItem.Id是标识属性。 属性Order.Total和Order.Discount是计算属性。 无法在客户端设置身份和计算属性 - 必须在服务器上设置它们的值,它们的值取决于服务器的逻辑。此外,应用服务器可以添加新订单(例如礼品),或修改现有商品的数量(取决于库存状态)。

在客户端,此模型包含在相应的视图模型中:

public class OrderVM : INotifyPropertyChanged
{
    private Order model;

    public OrderVM(Order model)
    {
        this.model = model;

        ...
    }

    public Int32 Id { ... }
    public Decimal Total { ... }
    public Decimal Discount { ... }
    public ObservableCollection<OrderItemVM> Items { ... }

    // ...
}

public class OrderItemVM : INotifyPropertyChanged
{
    public OrderItemVM(OrderItem model)
    {
        ...
    }

    public Int32 Id { ... }
    public String Name { ... }
    public Decimal Price { ... }
    public Decimal Quantity { ... }

    // ...
}

模型类实现INPC,因此,如果模型在UI之外更改,则视图模型将反映此更改。

应用程序服务器是WCF服务。这是它的合同:

[ServiceContract(...)]
public interface OrderService
{
    [OperationContract(...)]
    Order SaveOrder(Order order);
}

OrderService.SaveOrder的作用:它接收订单,检索身份和计算属性,更改订单(添加或更改项目),并将相同的订单返回给客户。

OrderVM有一个命令“Apply”。显示OrderVM的视图有一个按钮,该按钮绑定到OrderVM.Apply。 OrderVM.Apply必须调用OrderService.SaveOrder:

void ApplyExecute()
{
    var savedOrder = ordersService.SaveOrder(model);
}

问题。 从CLR的角度来看,源顺序(字段OrderVM.order)和savedOrder是不同的对象。 我需要反映现在出现在savedOrder中的更改,因此必须向用户显示这些更改。

有没有共同的方法或最佳做法,如何做到这一点? 请考虑到:

  • 命令是“Apply”,而不是“Save and close”:用户必须保持同一订单的同一视图;
  • 这是简单的模型,真正的模型会更复杂。

感谢。

1 个答案:

答案 0 :(得分:0)

一种常见的方法是创建更新批处理/存储过程,不仅可以更新/插入/删除数据,还可以在数据库中查询新数据。

调用此批处理时,您会收到新值,并且可以相应地更新模型和ViewModel。

当然,只需重新查询数据库中的所有数据就更容易,但可能会花费太多的带宽和/或处理时间。