【问题标题】:Combining .NET RIA Services and MVVM in Silverlight 3.0在 Silverlight 3.0 中结合 .NET RIA 服务和 MVVM
【发布时间】:2010-10-19 04:07:05
【问题描述】:

在 Silverlight 3.0 中使用 .NET RIA 服务和 MVVM 时,RIA 服务中的元数据类型和 MVVM 模式中的 ViewModel 有区别吗?这些是同一个东西还是应该分开?

元数据类型是部分实体类的密封内部类。那里似乎没有适当的分离,但元数据类型也可以用 Validation 的属性进行修饰,使其看起来像 ViewModel。

我已经四处搜索,但没有看到任何详细说明此问题的内容。

【问题讨论】:

    标签: silverlight silverlight-3.0 mvvm ria wcf-ria-services


    【解决方案1】:

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

    在服务器上:

    class Catalog : DomainService {
        IQueryable<Product> GetProducts(string keyword) { ... }
    }
    

    生成的 DomainContext:

    class Catalog : DomainContext {
        EntityList<Product> Products { get; }
        void LoadProducts(string keyword);
    }
    

    我要写的视图模型:

    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);
        }
    }
    

    最后在我的 xaml 中,我将 UserControl 的 DataContext 设置为 SearchViewModel 的一个实例,并将 ItemsControl 绑定到 Results 属性。我将使用您选择的 ViewModel 模式将按钮单击绑定到 Search(这实际上是 SearchViewModel 公开的命令)。我个人喜欢与Silverlight.FX 合作的东西,例如:

    <Button Content="Search"
      fxui:Interaction.ClickAction="$model.Search(keywordTextBox.Text)" />
    

    如最初所示here

    正如 Chuck 提到的,我的视图模型中可能确实有其他状态,例如,可能双向绑定到我的 xaml 中 ListBox 的 SelectedItem 的 SelectedProduct,然后将相同的 SelectedProduct 绑定为DataForm 显示所选产品的详细信息。

    希望对您有所帮助!我很快就会在我的blog 上写更多关于这个的博客。

    【讨论】:

    • 经过一周的思考,我想这就是我的想法。 DomianContext 不是完整的 ViewModel,而是它的一部分。 DomainService 的 MetadataType 中定义的属性(如 [Required])是否必须在 ViewModel 中重新声明,或者 DomainContext 是 ViewModel 的一部分,足以被验证引擎拾取?
    • 链接到 Nikhil 的主题博客文章:nikhilk.net/Entry.aspx?id=229
    • [必需] 等元数据属性在实体类型上 - 而不是在视图模型本身上。如果您从视图模型中公开实体的实例(例如,上面的视图模型示例中的产品),它们将被拾取。
    • 从虚拟机直接访问DomainContext 是否足够聪明?或者我应该把它包装在某种存储库中,或者用 UoW 来做?可以给我推荐一篇好文章吗?除非您认为从 VM 直接查询和操作数据到 DomainContext 是可以的。
    • 其实我刚刚在我的场景中找到了the exact answer
    【解决方案2】:

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

    【讨论】:

    • 我研究得越多,我想我想尽可能地隐藏 EntityObject 及其 MetaDataType。我认为你是对的,我可能想要 ViewModel 中的 DataContext,但我也想从 EntityObject 中删除 MetaData 内部类并将其移动到 ViewModel。对吗?
    • 等等。这听起来也不对。我认为 MetaData 类需要在服务器端,而 ViewModel 在客户端。啊。也许 ViewModel 属于共享代码?
    • 今天早上经过评论回答后,我终于意识到您回答了这个问题。嗨查克,好久不见。希望生活善待你。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-02-05
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多