2011-01-08 81 views
1

我正在构建我的第一个Silverlight应用程序。这个应用程序有几种形式,允许用户保存客户,供应商,员工等。每个页面有一个父控件(带有相应的视图模型)和一个或多个子控件(每个控件都有一个自己的视图模型)。例如,客户表单将客户用户控件作为父级,并将地址用户控件,电话号码用户控件作为子用户控件放在表单上。现在,当用户点击保存按钮时,父母“客户”负责确保为客户,地址和电话保存数据。在幕后,我可以在客户,地址和电话号码视图模型之间共享一个datacontext实例。所以当点击保存按钮时,客户用户控件可以保存所有三个数据(因为它的datacontext也有Address和PhoneNumber实体)。在视图模型之间共享上下文

我想知道如何将这个datacontext从客户传递给地址和电话号码?一种方法可能是将datacontext传递到Address和Phone number视图模型的各自构造函数中,但接下来我需要确保Address和PhoneNumber构造函数仅在Customer viewodel创建后才被调用。能有更好的解决方案吗? MEF是否提供更好的解决方案?

回答

1

您拥有Silverlight客户端的强大功能。含义:你有静态:-)

我在最近的应用程序中这样做的方式是创建一个ContextCache。基本上,它是一个静态类,它保存了我的任何ViewModel中使用的所有RIA上下文。像这样:

public static class ContextCache 
    { 
    private static TicketContext _ticketContext; 

    public static TicketContext TicketContext 
    { 
     get 
     { 
     if (_ticketContext == null) 
      _ticketContext = new TicketContext(); 

     return _ticketContext; 
     } 
     private set { _ticketContext = value; } 
    } 
    } 

所以,在一个视图模型,你只是做给ContextCache.TicketContext打个电话,你可以保存更改。通过这种方式,您可以利用RIA中的所有状态更改跟踪,并让它为您处理有关对象持久性的所有细节(如果您已正确编写了服务代码,但那是另一回事)。

0

也许你的体系结构有一个不好的解决方案,你可以用IsolatedStorageFile来模拟ASP.NET的会话!

从我的理解中,您正尝试在应用程序中过度使用MV-VM模式! ViewModel来到我们的生活的重要原因之一是因为单元测试!如果我是你,我会有一个Customer ViewModel并在我所有的子用户控件中使用!

根据复杂性和隔离性,如果子控件要求它拥有单独的ViewModel,则可以考虑父项ViewModel并具有子项ViewModel的属性。

public class ParentViewModel : FrameworkElement { 

    Child1ViewModel Child1 { get; set; } //Must be a dependency property 

    Child1ViewModel Child2 { get; set; } //Must be a dependency property 

    ICommand SaveButtonCommand; //Your delegate command of your save button 

    public ParentViewModel() { 
     Child1 = new Child1ViewModel(); 
     Child2 = new Child2ViewModel(); 
    } 
} 

而且你可以使用这个父视图上的父XAML

<UserControl.DataContext> 
    <ViewModels:ParentViewModels /> 
</UserControl.DataContext> 
<Controls:Child1 DataContext="{Binding Child1}" /> 
<Controls:Child2 DataContext="{Binding Child2}" /> 

你也有你的ParentViewModelICommand SaveButtonCommand并点击时与你的孩子ViewModelproperties操纵!

希望它有帮助!