在视图模型之间共享上下文

时间:2011-01-08 19:28:25

标签: silverlight viewmodel mef datacontext

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

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

2 个答案:

答案 0 :(得分:1)

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

我在最近的应用程序中执行此操作的方法是创建ContextCache。基本上,它是一个静态类,它包含我的所有RIA上下文,可用于任何ViewModel。像这样:

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

因此,在ViewModel中,您只需调用ContextCache.TicketContext即可保存更改。通过这种方式,您可以利用RIA中的所有状态更改跟踪,并让它处理有关对象持久性的所有详细信息(如果您已正确编码服务,那就是另一个故事)。

答案 1 :(得分:0)

也许对于您的架构,一个糟糕的解决方案可以使用IsolatedStorageFile,您可以模拟ASP.NET的会话!

根据我的理解,您正试图在您的应用中过度使用MV-VM模式! ViewModel来到我们生活中的一个重要原因是因为单元可测试!如果我是你,我会有一个Customer ViewModel并在我所有的 child-usercontrols 中使用它!

如果子控件要求它拥有单独的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}" />

您的ICommand SaveButtonCommand中还有ParentViewModel,并在点击时对您孩子properties中的ViewModel进行操作!

希望它有所帮助!