У меня есть ListPicker на странице приложения, но событие SelectionChanged вызывается несколько раз при загрузке страницы. Чтобы избежать этого, я следил за предыдущим вопросом, который задал здесь Событие, вызываемое несколько раз во время навигации, в котором было предложено вместо того, чтобы сделать ThemeListPicker_SelectionChanged родительской панелью стека внутри шаблона данных..', создать событие касания в StackPanel с именем stk_Tap
и 'использовать это касание stk_Tap для выполнения вашего действия так как это событие также будет вызываться каждый раз, когда вызывается изменение выбора, но оно не будет демонстрировать ошибочное поведение, подобное событию изменения выбора.
Теперь я соответствующим образом скорректировал свое решение, но я не знаю, как определить, какой элемент ListPicker выбран или выбран в данный момент. Также я удалил событие ListPicker SelectionChanged в ListPicker, потому что я думал, что StackPanel может получить элемент, но я не уверен, правильно ли это и как это сделать?
XAML
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="PickerItemTemplate">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme"
ItemTemplate="{StaticResource PickerItemTemplate}"
SelectionChanged="ThemeListPicker_SelectionChanged"/>
XAML.CS
private void ThemeListPicker_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
if(ThemeListPicker.SelectedIndex != -1)
{
var theme = (sender as ListPicker).SelectedItem;
if (index == 0)
{
Settings.LightTheme.Value = true;
MessageBox.Show("light");
}
else
{
Settings.LightTheme.Value = false;
MessageBox.Show("dark");
}
}
}
* РЕДАКТИРОВАТЬ: как я обновил свое решение
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="PickerItemTemplate">
<StackPanel tap="stk_Tap">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme"
ItemTemplate="{StaticResource PickerItemTemplate}"
/>
Таким образом, даже когда я оставил событие ListPicker SelectionChanged в коде после внесения изменений, я не видел, чтобы событие вызывалось дважды при загрузке/переходе на страницу, но я не уверен, как получить текущий выбранный элемент сейчас?
РЕДАКТИРОВАТЬ2**
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
themeList = new List<TestApp.Common.Theme>();
themeList.Add(new TestApp.Common.Theme() { Name = "Darker", name = "dark" });
themeList.Add(new TestApp.Common.Theme() { Name = "Lighter", name = "light" });
ThemeListPicker.ItemsSource = themeList;
}
private void stk_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (ThemeListPicker.SelectedIndex != -1)
{
//Need to get the current ThemeListPicker's 'name'
var selectedItem1 = (sender as StackPanel).DataContext as ListPicker;
//use selectedItem1
}
}