Prism ConfirmNavigationRequest () вызывается дважды, когда DataContext = this - PullRequest
0 голосов
/ 05 марта 2012

Я использую Prism, и мои представления реализуют IConfirmNavigationRequest, чтобы они могли выполнять проверки и отменять навигацию при необходимости.

Моя проблема в том, что у меня есть несколько представлений, которые не используют MVVMи определите DataContext = this.Это заставляет Prism дважды вызывать ConfirmNavigationRequest() моего представления, что означает, что я дважды запрашиваю ответ пользователя.

В основном происходит следующее:

  1. Prism проверяет, является ли представлениереализует IConfirmNavigationRequest и вызывает ConfirmNavigationRequest(), если это так.
  2. Пользователя спрашивают, хочет ли он продолжить.
  3. Пользователь нажимает кнопку ОК, а ConfirmNavigationRequest() возвращает true.
  4. Prism проверяет, реализует ли модель представления (в моем случае снова это представление) IConfirmNavigationRequest и, если да, вызывает ConfirmNavigationRequest().
  5. Пользователю снова задают вопрос:он хотел бы продолжить.

Как видите, Prism запрашивает у моего представления подтверждение дважды , поскольку оно запрашивает как представление, так и модель представления.

Итак, мой вопрос: как я могу предотвратить это или как я могу определить, какой вызов какой, и чтобы я мог игнорировать один из них?Я думал о том, чтобы исследовать параметр continuationCallback, но мне это решение не очень нравится, поскольку вряд ли оно сломается в следующих версиях Prism.

1 Ответ

0 голосов
/ 08 марта 2012

Лучшее решение, которое я получил до сих пор, это то, которое я получил от DCherubini на форуме Prism , что предполагает, что я не буду устанавливать DataContext представления на моем UserControl, а использовать внутренний элемент, который будет содержать вид, и вместо него установить DataContext:

<UserControl>
    <Grid x:Name="grid">
        ...
    </Grid>
</UserControl>

grid.DataContext = this;

вместо

<UserControl x:Name="uc">
</UserControl>

uc.DataContext = this;

Это должно сработать, но это означает, что мне нужно изменить каждый вид по отдельности. Решение, которое не требует внесения изменений в представления, было бы лучше.

...