DomainCollectionView和WCF RIA Services中的关联属性

时间:2011-11-07 14:02:15

标签: silverlight mvvm wcf-ria-services model-associations

我在我的poco课程中有一个关联,例如:

public class Category() {
    [Key]
    public int id { get; set}
    public string Name { get; set; }
    /* HERE */
    public virtual ICollection<Book> Books {get; set;}
}

public class Book() {
    [Key]
    public int id { get; set}
    public string Name { get; set; }
}

我使用MVVM patern,MVVM Light和RIA Services Toolkit。我的域服务实现包含一个包含其书籍的方法GetCategories,例如:

public IQueriable<Category> GetCategories()
{
    return Model.Categories.Include("Books").OrderBy(pCategory => pCategory.Name);
}

在我的ViewModel中,我有一个加载GetGruposQuery的DomainCollectionView。我还有一个绑定网格和其他控件的属性,如:

public ICollectionView CollectionViewCategories {
    get { return myDomainCollectionViewCategories;}
}

我需要获取一个子属性CollectionView.Books来绑定我的控件和ADD,在视图中删除它,但是这个属性只是EntityCollection而不是包含ADD,REMOVE等方法的DomainCollectionView。

如何在ViewModel中将当前Books属性(CollectionViewCategories)作为DomainCollectionView获取?

谢谢!


我用以下方法解决了这个问题:( CollectionViewCategories.CurrentItem as Category).Books.Remove(CollectionViewBooks.CurrentItem as Book)

private ICollectionView CreateView(Object source)
{
    CollectionViewSource cvs = new CollectionViewSource();
    cvs.Source = source;
    return cvs.View;            
}
//...
//After CollectionViewCategories loaded:
CollectionViewCategories.CurrentChanged += (s, e) =>
{
    if (CollectionViewCategories.CurrentItem != null)     
    {
        CollectionViewBooks = CreateView(fContext.Categories.Where(p => p.Id == (CollectionViewCategories.CurrentItem as Category).Id).FirstOrDefault().Books);
    }
    else
    {
        CollectionViewBooks = null;
    }
    RaisePropertyChanged("CollectionViewBooks");
};  

1 个答案:

答案 0 :(得分:0)

你为什么需要它? EntityCollection确实有这些方法(添加,删除......)
如果在调用它们时遇到错误,可能会导致Book类未完全暴露给客户端(域服务上缺少insert / update / delete方法) 为了澄清一下,DomainCollectionView打算包装一个EntityCollection,主要是为了更好地处理MVVM和绑定(参见link