在Silverlight 3.0中结合.NET RIA服务和MVVM

在Silverlight 3.0中结合.NET RIA服务和MVVM,silverlight,silverlight-3.0,mvvm,ria,wcf-ria-services,Silverlight,Silverlight 3.0,Mvvm,Ria,Wcf Ria Services,在Silverlight 3.0中使用.NET RIA服务和MVVM时,RIA服务的元数据类型和MVVM模式的ViewModel之间是否存在差异?这些是同一件事还是应该分开 元数据类型是部分实体类的密封内部类。这里似乎没有适当的分隔,但是元数据类型也可以用属性进行修饰以进行验证,这使得它看起来像一个ViewModel 我到处找了找,但没有看到任何关于这方面的细节 RIA服务数据上下文被设计为在MVVM模式中扮演ViewModel的角色,因为它们本机支持数据绑定,但在文档中不使用该术语。不过,这要

在Silverlight 3.0中使用.NET RIA服务和MVVM时,RIA服务的元数据类型和MVVM模式的ViewModel之间是否存在差异?这些是同一件事还是应该分开

元数据类型是部分实体类的密封内部类。这里似乎没有适当的分隔,但是元数据类型也可以用属性进行修饰以进行验证,这使得它看起来像一个ViewModel


我到处找了找,但没有看到任何关于这方面的细节

RIA服务数据上下文被设计为在MVVM模式中扮演ViewModel的角色,因为它们本机支持数据绑定,但在文档中不使用该术语。不过,这要视情况而定。您可能需要视图模型中的状态,而不是RIA数据上下文提供的状态,例如命令和其他与视图相关的状态。我认为您要做的是将RIA服务中的数据上下文用作视图模型的一部分。

同意ChuckJ的观点-通常,DomainContext构成视图模型的一部分。例如,假设我有一个允许搜索产品目录的搜索页面。以下是我如何组织事情的:

在服务器上:

class Catalog : DomainService {
    IQueryable<Product> GetProducts(string keyword) { ... }
}
类目录:域服务{
IQueryable GetProducts(字符串关键字){…}
}
生成的DomainContext:

class Catalog : DomainContext {
    EntityList<Product> Products { get; }
    void LoadProducts(string keyword);
}
类目录:DomainContext{
EntityList产品{get;}
void LoadProducts(字符串关键字);
}
我要写的视图模型是:

class SearchViewModel {
    Catalog _catalog = new Catalog();

    public IEnumerable<Product> Results {
        get { return _catalog.Products; }
    }

    public void Search(string keyword) {
        _catalog.Products.Clear();
        _catalog.LoadProducts(keyword);
    }
}
类SearchViewModel{
目录_Catalog=新目录();
可数结果{
获取{return\u catalog.Products;}
}
公共无效搜索(字符串关键字){
_catalog.Products.Clear();
_产品目录(关键字);
}
}
最后,在我的xaml中,我将UserControl的DataContext设置为SearchViewModel的实例,并将ItemsControl绑定到Results属性。我会使用您选择的ViewModel模式绑定一个按钮点击搜索(这实际上是一个SearchViewModel公开的命令)。我个人喜欢与我一起工作的东西,如:


正如最初所示

正如Chuck提到的,我的视图模型中可能确实存在其他状态,例如,SelectedProduct可能双向绑定到xaml中列表框的SelectedItem,然后将同一SelectedProduct绑定为DataForm的DataContext,以显示所选产品的详细信息


希望有帮助!我很快就会在博客上更多地讨论这个问题。

我越深入研究它,我想我会尽可能地隐藏EntityObject及其元数据类型。我认为您是对的,我可能希望在ViewModel中使用DataContext,但我也希望从EntityObject中删除元数据内部类并将其移动到ViewModel。对吗?等等。这听起来也不对。我认为元数据类应该在服务器端,而ViewModel应该在客户端。啊。也许ViewModel属于共享代码?今天早上查看了答案后,我终于意识到你回答了这个问题。嗨,恰克,好久不见了。希望生活对你很好。经过过去一周的思考,我想这就是我所想的。DominaContext不是完整的ViewModel,而是它的一部分。DomainService的MetadataType中定义的属性(如[Required])是否必须在ViewModel中重新声明,或者DomainContext是ViewModel的一部分这一事实是否足以被验证引擎拾取?链接到Nikhil的博客文章主题:[Required]元数据属性位于实体类型上,而不是视图模型本身。如果您从视图模型(例如上面视图模型示例中的产品)中公开实体的实例,它们将被拾取。从VM访问
DomainContext
是否足够聪明?或者我应该把它包装在某种存储库中,或者用UoW来做?你能给我推荐一篇好文章吗?除非你认为从VM到DomainContext的查询和操作数据是可以的。实际上我刚刚发现了我的场景。
<Button Content="Search"
  fxui:Interaction.ClickAction="$model.Search(keywordTextBox.Text)" />