我正在使用MVVM从WinForms世界迁移到WPF。
我的基本系统与POCO类(NHibernate)一起使用,我们使用一些DynamicProxy将这个POCO类映射到一些可绑定的类,因此ModelView可以公开POCO的代理并保存大量代码:
public class OrderViewModel
{
public OrderPOCO Order { get; private set; }
}
public class OrderView
{
public OrderView()
{
DataContext = DynamicProxy(new OrderViewModel(new OrderPOCO()));
}
}
public class OrderPOCO
{
public virtual int Number { get; set; };
public virtual IList<OrderItemPOCO> Items { get; set; };
}
public class OrderItemPOCO
{
public virtual decimal Qty { get; set; }
public virtual decimal Price { get; set; }
public virtual decimal Amount { get; set; }
}
OrderItemPOCO的集合被绑定到网格中。金额是一个计算属性,取决于一些复杂的规则(我不能把它放在POCO中,因为它不是一个简单的金额=数量*价格)。
当然,我可以在ViewModel中公开自定义的OrderItemViewModel和OrderItemViewModel的集合,但我需要重新编码我的POCO类。如何在不重新编码所有模型的情况下在MVVM中编写这种情况?
答案 0 :(得分:4)
你是对的,你需要一个OrderItemViewModel。但是你不必重写模型类,它将保持不变。你需要的是这样的:
public class OrderViewModel
{
public OrderViewModel(OrderPOCO order)
{
Order = order;
Items = new ObservableCollection<OrderItemViewModel>(order.Items.Select(o => new OrderItemViewModel(o)).ToArray());
Items.CollectionChanged += OnItemsCollectionChanged;
}
public OrderPOCO Order { get; private set; }
public ObservableCollection<OrderItemViewModel> Items { get; private set; }
private void OnItemsCollectionChanged(object sender, CollectionChangedEventArgs e)
{
// Synchronize this.Items with order.Items
}
}
public class OrderItemViewModel
{
public OrderItemPOCO OrderItem { get; private set; }
}
public class OrderPOCO
{
public virtual int Number { get; set; };
public virtual IList<OrderItemPOCO> Items { get; set; };
}
public class OrderItemPOCO
{
public virtual decimal Qty { get; set; }
public virtual decimal Price { get; set; }
public virtual decimal Amount { get; set; }
}