Я создал свойство, которое вызывает настраиваемое событие навигации (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);
}
}
Почему наклоняю вы делаете навигацию в SelectionChanged случае вместо? Вы тоже это попробовали? – Archana
Конструктор не будет вызван, потому что вы задали значение NavicationCacheMode. Я не думаю, что DataContext теряется при переходе назад – Archana
@LovetoCode Это был ответ, удалив строку 'NavicationCacheMode = required', разрешающую конструктору вызывать в течение жизненного цикла навигации. Не стесняйтесь добавлять в качестве ответа :) –