2016-04-29 2 views
0

Я создал свойство, которое вызывает настраиваемое событие навигации (NavigateTo), когда вызывается его сеттер. До сих пор навигационная система работает с первой попытки, т. Е. Элемент выбирается из представления списка, в котором выбранный элемент привязан к свойству, затем включается средство настройки свойств и, в свою очередь, триггеры навигации.Как сохранить контекст данных в событии навигации?

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

Я отлаживал вызов «NavigateTo», который не вызывается во второй раз, когда я перехожу обратно в MainPage и выбираю из списка. Это указывает на то, что конструктор страницы не был вызван, а контекст данных для виртуальной машины не установлен, что, в свою очередь, означает, что событие навигации сеттера не будет вызываться.

Вопрос:

Как я могу сохранить контекст данных во время навигации жизненного цикла между страницами?

MainViewModel - Навигационное событие вызывается в SelectedCouncilName сеттера, который проходит вниз ИНТ параметров для навигации:

private CouncilName _selectedCouncilName; 
    public CouncilName SelectedCouncilName 
    { 
     get 
     { 
      return _selectedCouncilName; 
     } 
     set 
     { 
      if (_selectedCouncilName != value) 
      { 
       _selectedCouncilName = value; 
       RaisePropertyChanged("SelectedCouncilName"); 
       _navCallBack.NavigateTo(_selectedCouncilName.ID);    
      } 
     } 

    } 

MainPage.xaml представления списка - выбранный элемент связан с SelectedCouncilName свойство:

<ListView x:Name="ZonesListView" 
         Margin="0,0,-12,0" 
         ItemsSource="{Binding CouncilNameItems}" 
         SelectedItem="{Binding SelectedCouncilName, 
              Mode=TwoWay}"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="0,0,0,17"> 
          <TextBlock Style="{ThemeResource ListViewItemTextBlockStyle}" 
             Text="{Binding CouncilAcronym}" 
             TextWrapping="Wrap" /> 
          <TextBlock Margin="12,-6,12,0" 
             Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" 
             Text="{Binding CouncilFullName}" 
             TextWrapping="Wrap" /> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 

MainPage.xaml.cs - код позади, где событие навигации запускается после запуска сеттера в свойстве SelectedCouncilName. (Я включил всю страницу код позади, чтобы показать подробную информацию о том, как установить контекст данных и метод навигации):

public sealed partial class MainPage : Page, INavigationCallback 
{ 
    MainViewModel vm; 

    private NavigationHelper navigationHelper; 

    public MainPage() 
    { 

     this.navigationHelper = new NavigationHelper(this); 
     this.navigationHelper.LoadState += navigationHelper_LoadState; 
     this.navigationHelper.SaveState += navigationHelper_SaveState; 

     //init data context 
     this.NavigationCacheMode = NavigationCacheMode.Required; 
     this.InitializeComponent(); 

     vm = new MainViewModel(this); 
     this.DataContext = vm; 
     vm.LoadCouncilNamesData(); 
    } 

    private void navigationHelper_SaveState(object sender, SaveStateEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    void navigationHelper_LoadState(object sender, LoadStateEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    /// <summary> 
    /// Invoked when this page is about to be displayed in a Frame. 
    /// </summary> 
    /// <param name="e">Event data that describes how this page was reached. 
    /// This parameter is typically used to configure the page.</param> 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 


     // TODO: Prepare page for display here. 

     // TODO: If your application contains multiple pages, ensure that you are 
     // handling the hardware Back button by registering for the 
     // Windows.Phone.UI.Input.HardwareButtons.BackPressed event. 
     // If you are using the NavigationHelper provided by some templates, 
     // this event is handled for you. 

    } 

    void INavigationCallback.NavigateTo(string ItemID) 
    { 
     Frame.Navigate(typeof(RequestTagPage), ItemID); 
    } 
} 
+0

Почему наклоняю вы делаете навигацию в SelectionChanged случае вместо? Вы тоже это попробовали? – Archana

+0

Конструктор не будет вызван, потому что вы задали значение NavicationCacheMode. Я не думаю, что DataContext теряется при переходе назад – Archana

+0

@LovetoCode Это был ответ, удалив строку 'NavicationCacheMode = required', разрешающую конструктору вызывать в течение жизненного цикла навигации. Не стесняйтесь добавлять в качестве ответа :) –

ответ

1

Удалить this.NavigationCacheMode = NavigationCacheMode.Required Для конструктора к вызывался, когда навигация назад

1

Если проблема заключается в том, что конструктор не вызывается, то я бы предложил сделать ваш viewmodel StaticResource или поместите его в локатор ViewModel. Когда вы привязываете его в XAML, datacontext останется неповрежденным.

Население может быть создано в конструкторе вашей модели, поскольку оно будет сгенерировано при необходимости.