2013-12-17 6 views
0

У меня есть 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 

     } 
    } 
+0

хорошо, вы можете также получать значение SelectedIndex с событием крана. –

ответ

0

Нет необходимости дополнительного мероприятия крана для такого рода работы.

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 событие вызывается несколько раз во время навигации для выше проблем, если я правильно угадать установить ItemsSource listpicker на OnNavigatedTo событии. поэтому изменить вас г OnNavigatedTo метод с

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

// Stack панели события водопроводную

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

Хорошо, я обязательно попробую это. Дело в том, что у меня есть MainPage, а затем ThemeListPicker находится на странице настроек, которая переводится с MainPage. Таким образом, применяется «e.NavigationMode! = NavigationMode.Back»? Как настроить этот оператор, чтобы предотвратить «ThemeListPicker_SelectionChanged» при двухкратном запуске, когда SettingsPage - NavigateTo? Кроме того, будет ли еще один вариант просто установить ItemSource ThemeListPicker в событие LoadPage Loaded? – Matthew

+0

@Matthew всякий раз, когда вы устанавливаете исходный элемент ThemeListPicker, срабатывает событие selectedchanged. Невозможно ограничить его. Поэтому я предлагаю вам выполнить свою работу над любым другим событием и удалить событие selectedchanged – Jaihind

+0

Ok. Я удалил событие ThemeListPicker_SelectionChanged, как показано в моем правлении выше. Я думал использовать StackPanel Tap для получения выбранного элемента в ListPicker. Мой вопрос, хотя это именно так, как я могу получить текущий выбранный элемент в ThemeListPicker из события StackPanel Tap? – Matthew

Смежные вопросы