У меня есть ListPicker на странице приложения, но событие SelectionChanged вызывается несколько раз по мере загрузки страницы. Чтобы избежать этого, я задал следующий вопрос, заданный здесь ListPicker SelectionChanged Event Called Multiple Times During Navigation, в котором было предложено вместо того, чтобы заставить ThemeListPicker_SelectionChanged создать родительскую стеклянную панель внутри datatemplate .. ', создать событие крана в StackPanel под названием stk_Tap
и использовать этот ответ stk_Tap, чтобы выполнить свое действие, это событие также будет вызвано каждый раз, когда будет изменен выбор, но он не будет показывать поведение с ошибкой, подобное изменению события «Как получить Tapped Item из Tapped Event в StackPanel
Теперь я скорректировал свое решение соответствующим образом, но я делаю не знаю, как определить, какой элемент 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");
}
}
}
* EDIT: Как я обновил мое решение
<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 в коде после внесения изменений, я не видел, чтобы событие вызывалось дважды при загрузке страницы/навигации но я не уверен, как получить текущий выбранный элемент сейчас?
EDIT2 **
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
}
}
хорошо, вы можете также получать значение SelectedIndex с событием крана. –