Использование данных из ViewModel в ModalDialog, даже если они находятся в оболочке

Я пишу UWP и использую шаблон 10.

Я создал ModalDialog, который должен показать пользователю некоторые данные, которые были только что рассчитаны в ViewModel.

Вот где я потерялся:

#1: ModalDialog нужны данные из моей ViewModel. # 2, ModalDialog должен вызывать 1+ метод (ы) в ViewModel в зависимости от того, какую кнопку нажимает пользователь.

Мой Shell.xaml.cs:

public sealed partial class Shell : Page
{
    public static Shell Instance { get; set; }
    public static HamburgerMenu HamburgerMenu => Instance.MyHamburgerMenu;


    public Shell()
    {
        Instance = this;
        InitializeComponent();
        if (App.MobileService.CurrentUser == null)
            LoginModal.IsModal = true;
    }

    public Shell(INavigationService navigationService) : this()
    {
        SetNavigationService(navigationService);
    }

    public void SetNavigationService(INavigationService navigationService)
    {
        MyHamburgerMenu.NavigationService = navigationService;
    }

    #region Login

    private void LoginLoggedIn(object sender, EventArgs e)
    {
       MyHamburgerMenu.NavigationService.Navigate(typeof(Views.MainPage));
       LoginModal.IsModal = false;
    }

    #endregion
}

}

Shell.xaml

<Controls:ModalDialog x:Name="ScoreModal" Grid.RowSpan="3"
                          CanBackButtonDismiss="False"
                          DisableBackButtonWhenModal="True">
        <Controls:ModalDialog.ModalContent>
            <myControls:QuizScorePart
                    HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
        </Controls:ModalDialog.ModalContent>
    </Controls:ModalDialog>

Что я пробовал:

Я попытался просто поместить элемент управления для ModalDialog в представление, которое использует ViewwModel, с которым я хочу общаться, но это не работает; это представление живет внутри оболочки, что означает, что все, что находится под ModalDialog, НЕ отключено. Насколько я знаю, он ДОЛЖЕН быть в Shell.

Я попытался настроить метод в файле Shell.xaml.cs, который устанавливает IsModal для моего диалога в значение true/false; это работает, но не решает мою проблему взаимодействия с моей ViewModel.

Я потерялся. Спасибо всем за помощь.


person user3007447    schedule 03.06.2016    source источник
comment
Не связанный с вашим вопросом: странно, что у вас есть общедоступный конструктор и свойство singleton Instance.   -  person Peter Torr - MSFT    schedule 03.06.2016
comment
Все, кроме входа в систему, было настроено с помощью шаблона, когда я создавал приложение.   -  person user3007447    schedule 03.06.2016


Ответы (1)


обратитесь к примеру поиска, в реальной части есть делегаты для обработки, посмотрите на программный код для LoginPart....

То, что я указал ниже в комментариях, - это то, как я делаю это с помощью LoginPage, а не пользовательского элемента управления. У которого есть LoginPageViewModel, на который, в свою очередь, ссылается экземпляр SettingsService.

Редактировать

Подумайте об этом так... ScoreModal - это не что иное, как еще один элемент управления представлением. QuizScorePart — это ваше представление, я предполагаю, что QuizScorePartViewModal существует. Оттуда это становится упражнением по передаче сообщений между моделями просмотра. По крайней мере, это то, что я вижу после последнего комментария. Вам нужно знать, на какую кнопку нажимал пользователь. Если предположить, что вышесказанное верно, то QuizViewModel отреагирует на это сообщение, которое она прослушивает. Оболочка — это просто место хранения для полного покрытия экрана, потому что оно реагирует только на IsModal. Если это проблема, подумайте о том, чтобы служба удерживала выбор кнопки, аналогично тому, как работает SettingsService. Ничто не говорит о том, что QuizScorePart не может иметь контекст данных, установленный в QuizViewModel, но в этот момент это может быть проблемой тестирования.

person mvermef    schedule 03.06.2016
comment
Я посмотрел на это. В нем есть события, которые общаются с Shell. Но это не отвечает, как я могу разговаривать с моей ViewModel. Элемент управления находится в Shell, поэтому я могу общаться с ним с помощью событий. - person user3007447; 03.06.2016
comment
Я на самом деле не использую этот метод, чтобы показать логин... Я делаю это через полную страницу и используя _settings.IsFullScreen = true, заставляя гамбургер полностью исчезнуть из поля зрения. Таким образом, SettingsService обрабатывает то, о чем вы говорите. IsFullScreen, я думаю, был частью обновленного проекта Template10, который был вытеснен. - person mvermef; 03.06.2016
comment
Что касается вашей ViewModel, какой из них, вы на самом деле не даете нам большую часть своей головоломки. LoginViewModel, ShellViewModel (если вы его создали)... и т.д... В частности, что вы пытаетесь сообщить модели представления? - person mvermef; 03.06.2016
comment
Я не включил ViewModel. Для Shell я просто использую Code-Behind, что я и показал. У меня есть ViewModel с именем QuizViewModel. Когда ShowScoreModal в QuizViewModel имеет значение true, я хочу, чтобы Modal отображался, но мне нужно, чтобы он отображал данные из QuizViewModel и привязывал свои кнопки к командам внутри QuizViewModel. - person user3007447; 03.06.2016
comment
Я думал, что модальный элемент управления был немного устаревшим для mvvm, он не очень хорошо подходит. Скоро появится служба просмотра, которая может облегчить часть головной боли, просто она еще не объединена с проектом. - person mvermef; 04.06.2016
comment
Вопрос: ничто не говорит о том, что QuizScorePart не может иметь контекст данных, установленный в QuizViewModel — это было бы, если бы я не использовал метод службы, верно? Я пробовал это, но он создает свой собственный объект QuizViewModel вместо того, чтобы использовать тот, который я использую для QuizPage. Поэтому, если нет другого способа настроить его на использование этого конкретного объекта QuizViewModel, этот способ не будет работать. Спасибо за предложение по обслуживанию, я рассмотрю его. - person user3007447; 04.06.2016
comment
Кроме того, я использую PRISM. Я думаю, что EventAggragators тоже могут работать, согласно этому блогу? Спасибо за помощь. rachel53461.wordpress.com/2011/06/05 / - person user3007447; 04.06.2016