Установите свойство ViewModel, открыв другой вид (связанный с другой ViewModel) из основного вида - PullRequest
0 голосов
/ 04 апреля 2011

Я новичок в WPF и MVVM, но я пытаюсь сделать все возможное для реализации шаблона MVVM в моем приложении (в основном я Java-разработчик недавно перешел на C #). Моя проблема в MVVM заключается в следующем сценарии:

Есть две модели, подобные этой:

class MyObj
{
    public string Name {get; set;}
    public MyOtherObj OtherObj {get; set;}
    //and some other properties
}

class MyOtherObj
{
    public int ID{get; set;}
    //and some other properties
}

и две модели просмотра: MyObjVM, который имеет объект MyObj, и MyOtherObjVM, который имеет объект MyOtherObj. И представление MyObjView, которое привязано к MyObjVM и имеет кнопку. Нажав на эту кнопку, нужно открыть другое представление (MyOtherObjView) с MyOtherObjVM в качестве его DataContext, а после закрытия второго представления объект MyOtherObj, созданный в MyOtherObjVM, следует передать объекту MyObj MyObjVM в первом представлении.

Я его погуглил, но ничего не нашел, кроме некоторых фреймворков, таких как MVVMLight, но я не нашел хорошей документации или тематических исследований. Есть ли какой-нибудь возможный способ решения этой проблемы без использования сторонних фреймворков, или использование фреймворков - мудрый выбор? (Я имею в виду, нужно ли много кода или просто реализовать, потому что я предпочитаю изучать, а не использовать фреймворки, но мое время ограничено).

И, наконец, извините за мой плохой английский: D

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Связь между ViewModel легко обрабатывается с помощью программы Messenger MVVMLight или EventAggregator от Caliburn.Micro. Я предпочел реализацию Caliburn.Micro, поскольку она была основана на интерфейсе, а не подписывалась напрямую на типы сообщений. Это обеспечивает гораздо большую гибкость при наследовании базовых классов.

Оба они действуют как центральная шина событий, на которую подписываются различные части. Это действительно помогает вам отправлять сообщения и обрабатывать их через границы.

Замечательно, что вам не нужны целые библиотеки MVVMLight или Caliburn.Micro для реализации этого. Вы можете просто вставить EventAggregator в свой проект. Вы найдете EventAggregator очень полезным для многих других сценариев, а также для включения обмена сообщениями между отделенными частями.

Еще одна замечательная вещь, которую нужно сделать, - это создать повторно используемые поведения, которые отправляют сообщения через EventAggregator. Обе эти функции вместе могут обеспечить несколько действительно хороших смешиваемых сценариев.

Пример MVVMLight Messenger: http://geekswithblogs.net/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx

Пример Caliburn.Micro EventAggregator: http://www.codeconfessions.com/2011/03/from-prism-to-caliburn-micro-event-aggregation/

0 голосов
/ 04 апреля 2011

Похоже, как открыть новое окно из ВМ.Есть несколько решений.

Использование сообщения. В MVVMLight, они называют его посредником, в платформе есть Messenger, если вы хотите открыть новое окно, вы можете зарегистрировать сообщение из части просмотранаходясь в виртуальной машине, вы просто отправляете сообщение.

...