Silverlight PRISM, создайте экземпляр представления и передайте данные в модель представления

Я искал вокруг и не нашел много информации об этом еще. У меня настроен проект PRISM, и пока все работает, в основном классе модуля я программно создаю свои представления.

То, что я пытаюсь сделать, это получить объект, отправленный в модель представления для каждого экземпляра представления. На данный момент я пытаюсь передать объект в конструктор представлений и сделать что-то вроде этого:

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

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

Это вызывает NullReferenceObject для vm.DataObject, я предполагаю, что на данный момент модель представления не была правильно создана.

Может ли кто-нибудь указать мне, как это должно быть сделано? должен ли объект данных даже отправляться через представление?

Спасибо за ваше время


person Community    schedule 25.09.2009    source источник


Ответы (4)


Поскольку вы используете контейнер Unity, вы можете использовать его для передачи объекта DataContext через представления. Используйте RegisterInstance при создании DataContext, а затем используйте Resolve в каждом соответствующем представлении. Если у вас более одного DataContext, используйте именованную регистрацию.

person Konamiman    schedule 25.09.2009
comment
Привет, спасибо за ваш ответ, я понимаю, что вы имеете в виду о контейнере, но каждый экземпляр имеет одно и то же представление и будет получать один и тот же переданный тип объекта, так как же будет работать именованная регистрация? поскольку представление не будет знать, какой контекст ему нужно разрешить. Кроме того, как разрешение контекста данных в представлении делает его доступным для модели представления? Спасибо еще раз - person ; 25.09.2009

В нашем коде и во всех видео, которые я смотрел, вы настраиваете так, чтобы представление принимало в качестве параметра ViewModel.

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

Если вам нужно передать что-то откуда-то еще, вы можете использовать eventAggregator, чтобы подписаться и опубликовать их.
Примерно так в том месте, где у вас есть DataObject:

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

И вот так, где вы хотите иметь к нему доступ (вероятно, к виртуальной машине):

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

Есть еще некоторые синхронные вещи, с которыми нужно иметь дело, но, если это то, что вы хотите, это должно вам помочь.

person thepaulpage    schedule 25.09.2009

В примере приложения я написал, что создал интерфейс, который был реализован представлением. Этот интерфейс имеет 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;
    }
}

Конструктор представления остается по умолчанию, и единственный код, который когда-либо будет в отделенном коде, — это метод 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 регистрирует типы в контейнере 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);
}
person Sorskoot    schedule 27.09.2009

Есть ли способ вручную создать представление и его модель представления и установить соответствующие объекты данных в модели представления, чтобы они могли быть привязаны к данным, а затем связать их вместе перед добавлением в регион?

person Community    schedule 25.09.2009