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

时间:2009-09-25 07:39:40

标签: silverlight prism viewmodel

我一直在环顾四周,但尚未找到相关信息。我有一个PRISM项目设置,到目前为止似乎都在工作,在模块的主要类中,我以编程方式创建我的视图。

我要做的是获取一个对象,该对象通过视图模型发送给每个视图实例。目前我正在尝试将对象传递给视图构造函数,并执行以下操作:

   public MyView(IUnityContainer container, List<string> myDataObject)
    {
        InitializeComponent();

        MyViewViewModel vm = LayoutRoot.DataContext as MyViewViewModel;
        vm.DataObject = myDataObject;
    }

这会导致vm.DataObject的NullReferenceObject,我认为此时尚未正确实例化viewmodel。

任何人都可以指导我如何做到这一点吗?应该通过视图发送数据对象吗?

感谢您的时间

4 个答案:

答案 0 :(得分:1)

由于您使用的是Unity容器,因此可以使用它通过视图传递DataContext对象。在创建DataContext时使用RegisterInstance,然后在每个适当的视图上使用Resolve。如果您有多个DataContext,请使用命名注册。

答案 1 :(得分:1)

在我们的代码和我观看的所有视频中,您进行了设置,以便视图作为参数获取ViewModel。

    public ThisView(ThisVM vm)
    {
        InitializeComponent();
        DataContext = vm;
    }

如果您需要从其他地方传递信息,可以使用eventAggregator订阅并发布给它们。
在你拥有DataObject的地方有点像这样:

    _EventAggregator.GetEvent<PushModelEvent>().Subscribe(ReceiveModel, true);

就像你想要访问它(可能是VM)一样:

    _EventAggregator.GetEvent<PushModelEvent>().Publish(_Model);

还有一些同步的事情需要处理,但是,如果这是你想要的,这应该让你去。

答案 2 :(得分:1)

在我编写的示例应用程序中,我创建了一个由视图实现的界面。该接口有1个成员SetViewModel。此方法采用一个对象,即ViewModel。 ViewModel为View提供了绑定和处理命令的位置。

public interface IDemoView
{
    void SetViewModel(object viewModel);
}

在实际视图中实现此接口如下所示:

public partial class DemoView : UserControl, IDemoView
{
    public DemoView()
    {
        InitializeComponent();
    }

    public void SetViewModel(object viewModel)
    {
        DataContext = viewModel;
    }
}

View的构造函数仍然是默认的,并且代码隐藏中唯一的代码就是这个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);
}

答案 3 :(得分:0)

有没有办法手动创建视图及其视图模型,并在viewmodel上设置相关数据对象,以便它们可以绑定数据,然后在添加到区域之前将它们连接在一起?