1

我一直在环顾四周,还没有找到太多关于这方面的信息。我设置了一个 PRISM 项目,到目前为止,这一切似乎都在工作,在模块的主类中,我正在以编程方式创建我的视图。

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

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

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

这会导致 vm.DataObject 出现 NullReferenceObject,我假设此时视图模型尚未正确实例化。

谁能指导我如何做到这一点?数据对象是否应该通过视图发送?

谢谢你的时间

4

4 回答 4

1

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

于 2009-09-25T07:51:03.477 回答
1

在我们的代码以及我看过的所有视频中,您都进行了设置,以便视图将 ViewModel 作为参数。

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

如果你需要从其他地方传递东西,你可以使用 eventAggregator 来订阅和发布它们。
在你有 DataObject 的地方有点像这样:

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

像这样你想要访问它的地方(可能是虚拟机):

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

仍然有一些同步的事情需要处理,但是,如果这是你想要的,这应该会让你继续前进。

于 2009-09-25T14:24:55.823 回答
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);
}
于 2009-09-27T09:38:54.707 回答
0

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

于 2009-09-25T12:50:28.127 回答