Wpf MVVM中POCO的处理

Wpf MVVM中POCO的处理,wpf,nhibernate,mvvm,poco,Wpf,Nhibernate,Mvvm,Poco,我正在使用MVVM从WinForms world迁移到WPF 我的基本系统使用POCO类(NHibernate),我们使用一些DynamicProxy将这些POCO类映射到一些可绑定的类中,这样ModelView就可以公开POCO的代理并节省大量代码: public class OrderViewModel { public OrderPOCO Order { get; private set; } } public class OrderView { public Order

我正在使用MVVM从WinForms world迁移到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; }
}
公共类OrderViewModel
{
公共订单POCO订单{get;private set;}
}
公共类OrderView
{
公共秩序视图()
{
DataContext=DynamicProxy(新的OrderViewModel(新的OrderPOCO());
}
}
公共类OrderPOCO
{
公共虚拟整数{get;set;};
公共虚拟IList项{get;set;};
}
公共类OrderItemPOCO
{
公共虚拟十进制数量{get;set;}
公共虚拟十进制价格{get;set;}
公共虚拟十进制数{get;set;}
}
OrderItemPOCO的集合绑定到一个网格中。金额是一个计算属性,取决于一些复杂的规则(我不能把它放在POCO中,因为它不是一个简单的金额=数量*价格)


当然,我可以在ViewModel中公开自定义OrderItemViewModel和OrderItemViewModel的集合,但我需要重新编码POCO类。如何在MVVM中编写这种情况而不重新编码所有模型?

你说得对,你需要一个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; }
}
公共类OrderViewModel
{
public OrderViewModel(OrderPOCO订单)
{
订单=订单;
Items=newobserveCollection(order.Items.Select(o=>neworderitemviewmodel(o)).ToArray();
Items.CollectionChanged+=OnItemsCollectionChanged;
}    
公共订单POCO订单{get;private set;}
公共可观测集合项{get;private set;}
private void OnItemCollectionChanged(对象发送方,CollectionChangedEventArgs e)
{
//将此.Items与订单.Items同步
}
}
公共类OrderItemViewModel
{
public OrderItemPOCO OrderItem{get;private set;}
}
公共类OrderPOCO
{
公共虚拟整数{get;set;};
公共虚拟IList项{get;set;};
}
公共类OrderItemPOCO
{
公共虚拟十进制数量{get;set;}
公共虚拟十进制价格{get;set;}
公共虚拟十进制数{get;set;}
}

同意@用户598839,为什么要重写POCO类来引入ViewModel?毕竟,MVVM的要点是视图和模型彼此透明。。。(事实上,ViewModel也不知道视图!)