Silverlight PRISM,实例化视图并将数据传递到viewmodel中
我一直在四处寻找,还没有找到太多关于这方面的信息。我已经建立了一个PRISM项目,到目前为止,它似乎都在工作,在一个模块的主要类中,我正在通过编程创建我的视图 我试图做的是为视图的每个实例获取一个发送到viewmodel的对象。目前,我正在尝试将对象传递到视图构造函数中,并执行如下操作:Silverlight PRISM,实例化视图并将数据传递到viewmodel中,silverlight,prism,viewmodel,Silverlight,Prism,Viewmodel,我一直在四处寻找,还没有找到太多关于这方面的信息。我已经建立了一个PRISM项目,到目前为止,它似乎都在工作,在一个模块的主要类中,我正在通过编程创建我的视图 我试图做的是为视图的每个实例获取一个发送到viewmodel的对象。目前,我正在尝试将对象传递到视图构造函数中,并执行如下操作: public MyView(IUnityContainer container, List<string> myDataObject) { InitializeComp
public MyView(IUnityContainer container, List<string> myDataObject)
{
InitializeComponent();
MyViewViewModel vm = LayoutRoot.DataContext as MyViewViewModel;
vm.DataObject = myDataObject;
}
public partial class DemoView : UserControl, IDemoView
{
public DemoView()
{
InitializeComponent();
}
public void SetViewModel(object viewModel)
{
DataContext = viewModel;
}
}
公共MyView(IUnityContainer容器,列出myDataObject)
{
初始化组件();
MyViewModel vm=LayoutRoot.DataContext作为MyViewModel;
vm.DataObject=myDataObject;
}
这会导致vm.DataObject出现一个NullReferenceObject,我假设viewmodel此时没有正确实例化
有人能告诉我应该怎么做吗?数据对象是否应该通过视图发送
感谢您抽出时间因为您使用的是Unity容器,所以可以使用它通过视图传递DataContext对象。创建DataContext时使用
RegisterInstance
,然后在每个适当的视图上使用Resolve
。如果您有多个DataContext,请使用命名注册。是否有方法手动创建视图及其视图模型,并在viewmodel上设置相关数据对象,以便它们可以进行数据绑定,然后在添加到区域之前将两者绑定在一起?在我们的代码中,以及在我观看的所有视频中,将其设置为使视图将ViewModel作为参数
public ThisView(ThisVM vm)
{
InitializeComponent();
DataContext = vm;
}
如果您需要从其他地方传递信息,您可以使用eventAggregator订阅和发布这些信息。在有数据对象的地方,有点像这样:
_EventAggregator.GetEvent<PushModelEvent>().Subscribe(ReceiveModel, true);
\u EventAggregator.GetEvent().Subscribe(ReceiveModel,true);
像这样,您希望访问它(可能是VM):
\u EventAggregator.GetEvent().Publish(\u Model);
仍然有一些同步的事情需要处理,但是,如果这是您想要的,这应该可以让您继续。在我编写的一个示例应用程序中,我创建了一个由视图实现的接口。此接口有1个成员SetViewModel。此方法获取一个对象,即ViewModel。ViewModel为视图提供了要绑定到的位置并处理命令
public interface IDemoView
{
void SetViewModel(object viewModel);
}
此接口在实际视图中的实现如下所示:
public MyView(IUnityContainer container, List<string> myDataObject)
{
InitializeComponent();
MyViewViewModel vm = LayoutRoot.DataContext as MyViewViewModel;
vm.DataObject = myDataObject;
}
public partial class DemoView : UserControl, IDemoView
{
public DemoView()
{
InitializeComponent();
}
public void SetViewModel(object viewModel)
{
DataContext = viewModel;
}
}
视图的构造函数仍然是默认的,codebehind中唯一的代码就是这个SetViewModel方法
在ViewModel类的构造函数中,它调用此方法并将自身传递给视图
public IDemoView View { get; private set; }
private IDemoModel _model;
public DemoViewModel( IDemoView view, IDemoModel model)
{
_model = model;
View = view;
View.SetViewModel(this);
}
Module类中的initialize方法向UnityContainer注册类型,并将视图添加到区域
public void Initialize()
{
_container.RegisterType<IDemoView, DemoView>();
_container.RegisterType<IDemoModel, DemoModel>();
_container.RegisterType<IDemoViewModel, DemoViewModel>();
var viewModel = _container.Resolve<IDemoViewModel>();
_regionManager.Regions["MainRegion"].Add(viewModel.View);
}
public void Initialize()
{
_container.RegisterType();
_container.RegisterType();
_container.RegisterType();
var viewModel=_container.Resolve();
_regionManager.Regions[“MainRegion”].Add(viewModel.View);
}
Hi,感谢您的回复,我明白您对容器的意思,但是每个实例都具有相同的视图,并且将接收传入的相同对象类型,那么命名注册将如何工作?因为视图不知道需要解析哪个上下文。此外,解析视图中的datacontext如何使其可用于viewmodel?再次感谢