我正在构建我的第一个silverlight应用程序。此应用程序有多种形式,允许用户保存客户,供应商,工作人员等。每个页面都有一个父用户控件(具有相应的视图模型)和一个或多个子用户控件(每个用户控件都有自己的视图模型)。例如,客户表单将客户用户控件作为父级和地址用户控件,电话号码UserControl作为表单上的子用户控件。现在,当用户单击“保存”按钮时,父级“客户”负责确保为客户,地址和电话保存数据。在幕后我可以在客户,地址和电话号码视图模型之间共享一个datacontext实例。因此,当单击“保存”按钮时,客户用户控件可以保存所有三个数据(因为其datacontext也将具有Address和PhoneNumber实体)。
我想知道如何将此datacontext从客户传递到地址和电话号码?一种方法是将datacontext传递给各自构造函数中的地址和电话号码视图模型,但是我需要确保仅在创建Customer视图编码后才调用Address和PhoneNumber构造函数。有没有更好的解决方案? MEF能提供更好的解决方案吗?
答案 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
进行操作!
希望它有所帮助!