Как управлять созданием экземпляров при навигации - PullRequest
0 голосов
/ 16 января 2012

Я программирую приложение WP7, придерживающееся шаблона MVVM.

У меня есть ViewModelLocator, который гарантирует, что каждый экземпляр ViewModel является только одним.Эти ViewModels создаются при запуске приложения.ViewModels общаются друг с другом с помощью сообщений.Я использую сообщения для перехода на следующую страницу (для этого я использую NavigationService.Navigate (), который вызывается из MainPage CodeBehind - это единственная функциональность, которая есть в CodeBehind).View и ViewModels соединяются вместе, устанавливая DataContext на странице в ViewModelLocator.

Everythig работает с первого взгляда.

Но во время каждой навигации создается новый экземпляр страницы, который подключен кViewModel из ViewModelLocator (который предназначен для него).В результате: когда пользователь часто переключается между страницами, существует несколько экземпляров страницы, подключенной к одной ViewModel.Конечно, в одной точке видна только одна страница.

Очень простым решением может быть установка NavigationCache, но он доступен только для чтения в WP7.

Я ищу решение нежелательного поведения.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Вы можете попытаться объявить экземпляр вашей ViewModel в App.xaml.cs, например,

private static YourViewModel viewModel = null;
public static YourViewModel ViewModel
{
    get
    {
        // Delay creation of the view model until necessary
        if (viewModel == null)
            viewModel = ViewModelLocator.MainStatic;

        return viewModel;
    }
}

Затем со страницы, на которую вы перейдете, вы можете ссылаться на нее как App.ViewModel.

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

<vm:ViewModelLocator x:Key="VMLocator" />

Если vm ссылается на ваше основное приложение, то вы можете использовать его следующим образом:

((ViewModelLocator)Application.Current.Resources["VMLocator"]).YourViewModel;

Надеюсь, это поможет.

0 голосов
/ 17 января 2012

Каждый раз, когда вы переходите куда-то, для этой страницы создается новый экземпляр. Вы можете избежать этого, используя NavigationService.GoBack (); где бы ты не мог.

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...