MVVM Toolkit light Messenger в цепочке сообщений - PullRequest
0 голосов
/ 11 ноября 2010

это может быть сложно объяснить, но я попробую ...

Я хотел бы использовать Messenger для перехода на новую страницу, а также для создания нового объекта (или пропуска его). Как это возможно, или я на неправильном пути?

В основном: Нажмите кнопку «Добавить нового человека», которая должна вызвать PersonView, а также должна содержать новый экземпляр объекта Person.

Нажмите кнопку «Добавить человека», которая должна открыть ту же страницу PersonView и получить выбранный объект.

Сообщение 1 = открыть Uri / Сообщение 2 отправить существующий или новый объект.

Пока у меня есть MainPageViewModel, который отправляет

 Messenger.Default.Send<Uri>(...)...

И MainPage.cs, который регистрирует Messenger.Default.Register<Uri>(...) и выполняет

Frame.Navigate(...targetUri)....

Я пытался отправить сообщение PersonViewModel сразу после Frame.Navigate ... но это не синхронизировано ... поэтому страница не была загружена для получения PersonMessage, ...

Так что любые советы, хитрости, вылики, подходы были бы отличными ...

Спасибо ...

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

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


открытый класс NavigationFrameController {

    private static NavigationFrameController _instance;       
    private MainPage _root;
    public Frame NavFrame { get; set;}
    private static object keyLock = new Object();

    NavigationFrameController() {

        _root = (MainPage)Application.Current.RootVisual;
        NavFrame = _root.ContentFrame;
        NavFrame.Navigated += new NavigatedEventHandler(ContentFrame_Navigated);
        NavFrame.NavigationFailed += new  NavigationFailedEventHandler(ContentFrame_NavigationFailed);

    }

    public static NavigationFrameController Instance {
        get {
            if (_instance == null)
                lock (keyLock) {
                  _instance = new NavigationFrameController();
               }
            return _instance;
        }
    }

     public void NavigateTo(Uri uri) {

        NavFrame.Source = uri;

    }

     private void ContentFrame_Navigated(object sender, NavigationEventArgs e) {
          //send your message
          // get attached to this event and get notified

     }

      private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) {
     }
0 голосов
/ 23 мая 2011

Я думаю, что вам следует сохранить первое сообщение для навигации и добавить к нему информацию об объекте (человеке), которого вы хотите отправить. вы можете добавить параметр в строку запроса, скажем, «add = true», а затем вы можете создать объект обычно в модели представления или идентификатор объекта для редактирования, и в этом случае модель представления может получить сам объект и отредактируйте его.

Чтобы достичь этого, в коде позади PersonView (связанного с PersonViewModel) необходимо отправить сообщение при навигации (OnNavigatedTo) в его ViewModel, содержащую полученную информацию из строки запроса.

0 голосов
/ 11 ноября 2010

У меня была та же проблема - по сути, когда вы получаете сообщение об открытии нового окна, также создаете модель представления и добавляете ее в представление как datacontext. Когда вы создаете экземпляр своей модели view в существующем объекте или null и т. Д. ... тогда в вашей модели представления вы можете обрабатывать, является ли он новым или существующим объектом.

Если вы используете внедрение зависимостей, тогда вызовите решение из кода, где вы обрабатываете сообщение «добавить человека» и т. Д.

...