Silverlight PRISM,实例化视图并将数据传递到viewmodel中

Silverlight PRISM,实例化视图并将数据传递到viewmodel中,silverlight,prism,viewmodel,Silverlight,Prism,Viewmodel,我一直在四处寻找,还没有找到太多关于这方面的信息。我已经建立了一个PRISM项目,到目前为止,它似乎都在工作,在一个模块的主要类中,我正在通过编程创建我的视图 我试图做的是为视图的每个实例获取一个发送到viewmodel的对象。目前,我正在尝试将对象传递到视图构造函数中,并执行如下操作: public MyView(IUnityContainer container, List<string> myDataObject) { InitializeComp

我一直在四处寻找,还没有找到太多关于这方面的信息。我已经建立了一个PRISM项目,到目前为止,它似乎都在工作,在一个模块的主要类中,我正在通过编程创建我的视图

我试图做的是为视图的每个实例获取一个发送到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;
    }
}
公共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?再次感谢