我一直在环顾四周,但尚未找到相关信息。我有一个PRISM项目设置,到目前为止似乎都在工作,在模块的主要类中,我以编程方式创建我的视图。
我要做的是获取一个对象,该对象通过视图模型发送给每个视图实例。目前我正在尝试将对象传递给视图构造函数,并执行以下操作:
public MyView(IUnityContainer container, List<string> myDataObject)
{
InitializeComponent();
MyViewViewModel vm = LayoutRoot.DataContext as MyViewViewModel;
vm.DataObject = myDataObject;
}
这会导致vm.DataObject的NullReferenceObject,我认为此时尚未正确实例化viewmodel。
任何人都可以指导我如何做到这一点吗?应该通过视图发送数据对象吗?
感谢您的时间
答案 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上设置相关数据对象,以便它们可以绑定数据,然后在添加到区域之前将它们连接在一起?