How to Get Tapped Item from Tapped Event in StackPanel

2.5k views Asked by At

I have a ListPicker in an application page, but the SelectionChanged event gets called multiple times as the page loads. To avoid this, I have been following a previous question I asked here ListPicker SelectionChanged Event Called Multiple Times During Navigation in which the suggestion was instead of making ThemeListPicker_SelectionChanged make a parent stackpanel inside the datatemplate..', create a tap event in the StackPanel called stk_Tap, and 'use this tap stk_Tap to do your action as, this event would also get called every time the selection changed gets called but, it wont exhibit the buggy behavior like that of selection changed event'

Now I have adjusted my solution accordingly, but I do not know how to determine which item of the ListPicker is being selected or is currently selected. Also I removed the ListPicker SelectionChanged event in the ListPicker because I thought the StackPanel could get the item, but I am not sure if this is correct or how to do this?

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: How I updated my solution

<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}" 
                />

So, even when I left the ListPicker SelectionChanged event in the code behind after making the modifications, I did not see the event being called twice upon the page loading/navigating to, but I am not sure how to get the currently selected item now?

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

        }
    }
1

There are 1 answers

5
Jaihind On

No need to extra tap event for such kind of work.

private void ThemeListPicker_SelectionChanged(object sender,
                                          SelectionChangedEventArgs e)
{
   if(ThemeListPicker.SelectedIndex==-1)
           return;
       var theme = (sender as ListPicker).SelectedItem;
       if (index == 0)
       {
          Settings.LightTheme.Value = true;
          MessageBox.Show("light");
       }
       else
       {
           Settings.LightTheme.Value = false;
           MessageBox.Show("dark");
       } 
       ThemeListPicker.SelectedIndex=-1                              
} 

ListPicker SelectionChanged Event Called Multiple Times During Navigation for above problem if i guess right you set listpicker's itemssource on OnNavigatedTo event. so modify you r onNavigatedTo method with

protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            if (e.NavigationMode != NavigationMode.Back)
            {
            // Your code goes here
            }
        }

//Stack panel tap event

private void stack_Tap(object sender, System.Windows.Input.GestureEventArgs e)
   {
    var selectedIrem = (Cast as your type)(sender as StackPanel).DataContext;
   }