Событие ListPicker SelectionChanged, вызываемое несколько раз во время навигации

У меня есть событие SelectionChanged в ListPicker на одной из страниц моего приложения, которое срабатывает несколько раз до загрузки страницы. Это действительно неудобно для меня, так как при выборе элемента отображается MessageBox (и будут выполняться другие действия). MessageBox отображается дважды каждый раз, когда страница является NavigatedTo. Как я могу это исправить?

XAML

<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");
       }
   }                            
}

person Matthew    schedule 15.12.2013    source источник


Ответы (2)


ну, вот как ведет себя список, лучше всего вместо того, чтобы делать ThemeListPicker_SelectionChanged, сделать родительскую панель стека внутри шаблона данных примерно так

<Listpicker.ItemTemplate>
<DataTemplate x:Name="PickerItemTemplate"> 
               <StackPanel tap="stk_Tap"> 
                    <TextBlock/> 
                </StackPanel> 
            </DataTemplate>
</Listpicker.ItemTemplate>
<Listpicker.FullModeItemTemplate>
            <DataTemplate x:Name="PickerFullModeItemTemplate"> 
                <StackPanel tap="stk_Tap"> 
                    <TextBlock/> 
                </StackPanel> 
            </DataTemplate>
<Listpicker.FullModeItemTemplate>

теперь используйте этот кран stk_Tap, чтобы выполнить свое действие, поскольку это событие также будет вызываться каждый раз, когда вызывается изменение выбора, но оно не будет демонстрировать ошибочное поведение, подобное событию изменения выбора.

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

person A.K.    schedule 15.12.2013
comment
Как получить элемент, выбранный в ListPicker, из события stk_Tap? - person Matthew; 16.12.2013

Прикрепите событие SelectionChanged после загрузки ListPicker.

        ...
        InitializeComponent();
        YourListPicker.Loaded += YourListPicker_Loaded;
        ...

    private void YourListPicker_Loaded(object sender, RoutedEventArgs e)
    {
        YourListPicker.SelectionChanged += YourListPicker_SelectionChanged;
    }
person Gabriel P.    schedule 02.09.2014
comment
Мне придется попробовать это, это было бы гораздо более предпочтительным решением для того, что я сейчас делаю, в соответствии с ответом, который я выбрал. - person Matthew; 03.09.2014